Dan*_*ger 5 c++ multithreading stl c++11
在我的一个项目中,我确定了std::deque<T>::clear()一个主要的瓶颈.
因此,我决定在专用的低优先级线程中移动此操作:
template <class T>
void SomeClass::parallelClear(T& c)
{
if (!c.empty())
{
T* temp = new T;
c.swap(*temp); // swap contents (fast)
// deallocate on separate thread
boost::thread deleteThread([=] () { delete temp; } );
// Windows specific: lower priority class
SetPriorityClass(deleteThread.native_handle(), BELOW_NORMAL_PRIORITY_CLASS);
}
}
void SomeClass:clear(std::deque<ComplexObject>& hugeDeque)
{
parallelClear(hugeDeque);
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常(VisualC++ 2010),但我想知道我是否忽略了任何重大缺陷.我欢迎您就上述代码发表意见.
其他信息:
SomeClass:clear()从GUI线程调用,用户界面无响应,直到调用返回.的hugeQueue,而另一方面,是不可能被通过该线程几秒钟后清除访问.
仅当您保证对堆的访问是序列化的时,这才有效。默认情况下, Windows会序列化对主堆的访问,但可以关闭此行为,并且不能保证它可以跨平台或库。因此,我会小心地依赖它 - 确保明确指出它依赖于线程之间共享的堆,并且该堆是线程安全访问的。
我个人只是建议使用自定义分配器来匹配分配/释放模式将是最好的性能改进 - 请记住,创建线程具有不小的开销。
编辑:如果您使用 GUI/工作线程风格的线程设计,那么实际上,您应该在工作线程上创建、管理和销毁双端队列。
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |