c++ - 在专用线程中清除 STL

标签 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);
}

这似乎工作正常(VisualC++ 2010),但我想知道我是否忽略了任何重大缺陷。欢迎您对上述代码提出意见。

附加信息:

SomeClass:clear()从 GUI 线程调用,用户界面在调用返回之前没有响应。 hugeQueue ,另一方面,在清除后的几秒钟内不太可能被该线程访问。

最佳答案

这仅在您保证对堆的访问是序列化的情况下才有效。默认情况下,Windows 确实 序列化对主堆的访问,但可以关闭此行为,并且不能保证它跨平台或跨库。因此,我会小心依赖它 - 确保明确指出它取决于线程之间共享的堆,并且堆是线程安全的,可以访问。

我个人会简单地建议使用自定义分配器来匹配分配/ Release模式将是这里最好的性能改进 - 请记住,创建线程的开销不小。

编辑:如果您正在使用 GUI/工作线程风格的线程设计,那么实际上,您应该创建、管理销毁工作线程上的双端队列。

关于c++ - 在专用线程中清除 STL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4889009/

相关文章:

c++ - 如何将元素添加到链表的末尾

python - 使用队列 Tensorflow 训练模型

java线程: Thread.中断()不工作

c++ - 为什么 std::queue::pop 不返回值。?

c++ - 我可以将参数传递给 std::vector 排序函数吗?

c++ - 实现自定义的类 STL 数据结构

c++ - C++ 中富有表现力的断言失败消息

c++ - 隐式转换掩盖了重载的运算符。如何解决?

C++ 回调?我应该使用成员函数指针/委托(delegate)/事件吗?

multithreading - 每个 Actor 的 Akka 套接字