在以下示例中(并非所有代码都包含必要部分):
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对象被破坏时,线程将被分离。一旦线程被分离,它将继续执行,直到在构造中提供的函数或可调用对象的调用完成,或程序终止"。 所以在我的情况下,线程不应该被打断或?
提前致谢。
答案 0 :(得分:1)
第二个解决方案将暂停主线程等待写入线程完成。如果你这样做,你就可以删除互斥锁。保证你有一个文件写作线程。
第一个解决方案是允许主线程继续,并将创建一个不受控制的写入线程 - 在互斥锁上序列化。虽然您可能认为这更好(主线程不会等待)但我不喜欢这个解决方案有几个原因。
首先,您无法控制创建的线程数。如果经常调用该函数,并且操作很慢,则可以轻松耗尽线程!其次,更重要的是,您将积累等待互斥锁的分离线程的积压。如果您的主应用程序决定退出,则所有这些线程将被静默杀死,更新将丢失。