使用相同的boost:thread变量来创建多个线程

时间:2015-09-03 12:52:10

标签: c++ multithreading boost

在以下示例中(并非所有代码都包含必要部分):

class A
{
public:
void FlushToDisk(char* pData, unsigned int uiSize)
{
    char* pTmp = new char[uiSize];
    memcpy(pTmp, pData, uiSize);
    m_Thread = boost::thread(&CSimSwcFastsimExporter::WriteToDisk, this, pTmp, uiSize);

}
void WriteToDisk(char* pData, unsigned int uiSize)
{
    m_Mtx.lock();
    m_ExportFile.write(pData, uiSize);
    delete[] pData;
    m_Mtx.unlock();
}
boost::thread m_Thread;
boost::mutex  m_Mtx
}

以这种方式使用m_Thread是安全的,因为在创建的线程执行WriteToDisk方法时可以调用FlushToDisk方法。 或者我应该做些什么:

  m_Thread.join();
  m_Thread = boost::thread(&CSimSwcFastsimExporter::WriteToDisk, this, pTmp, uiSize);

这第二个解决方案会比第一个解决方案慢吗?

从我在http://www.boost.org/doc/libs/1_59_0/doc/html/thread/thread_management.html#thread.thread_management.tutorial看到的 "当代表执行线程的boost :: thread对象被破坏时,线程将被分离。一旦线程被分离,它将继续执行,直到在构造中提供的函数或可调用对象的调用完成,或程序终止"。 所以在我的情况下,线程不应该被打断或?

提前致谢。

1 个答案:

答案 0 :(得分:1)

第二个解决方案将暂停主线程等待写入线程完成。如果你这样做,你就可以删除互斥锁。保证你有一个文件写作线程。

第一个解决方案是允许主线程继续,并将创建一个不受控制的写入线程 - 在互斥锁上序列化。虽然您可能认为这更好(主线程不会等待)但我不喜欢这个解决方案有几个原因。

首先,您无法控制创建的线程数。如果经常调用该函数,并且操作很慢,则可以轻松耗尽线程!其次,更重要的是,您将积累等待互斥锁的分离线程的积压。如果您的主应用程序决定退出,则所有这些线程将被静默杀死,更新将丢失。