gpt4 book ai didi

c++ - 使用相同的 boost :thread variable to create multiple threads

转载 作者:行者123 更新时间:2023-11-28 06:06:12 25 4
gpt4 key购买 nike

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

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 对象被销毁时,线程将被分离。一旦线程被分离,它将继续执行,直到构造时提供的函数或可调用对象的调用完成,或者程序是终止”。所以在我的例子中,线程不应该被中断或者?

提前致谢。

最佳答案

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

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

首先,您无法控制创建线程的数量。如果函数调用频繁,运行缓慢,很容易出现线程耗尽的情况!其次,也是更重要的一点,您将积压等待互斥体的分离线程。如果您的主应用程序决定退出,所有这些线程都将被静默杀死并且更新将丢失。

关于c++ - 使用相同的 boost :thread variable to create multiple threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32376206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com