gpt4 book ai didi

c++ - 安全终止 Meyers Singleton 中的线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:02 25 4
gpt4 key购买 nike

我有一个在 Meyers 单例中运行的 boost 线程。它在我的程序期间愉快地运行。

当我的 Singleton 的析构函数被调用时(当程序加载出内存时)我设置了一个标志以便线程应该退出它的循环并触发对 thread.join() 的调用。

现在,在 Windows 上,调用 thread.join() 会导致错误访问异常。但是在 Mac 上,不会调用 thread.join() 会引发错误的访问异常!

谁能阐明这两个操作系统之间的这种行为差异,和/或提供有关如何安全终止我的线程的说明?

编辑:如果我在一个简单的命令行应用程序中运行这段代码,它在 Mac 和 Windows 上都有效。我是否调用 myThread.join() 并不重要!

作为共享库运行会出现问题...当我第二次尝试重新加载 dylib 并且我忽略了对 myThread.join() 的调用时,Mac 上发生了内存异常,

例子:

#include "boost/thread.hpp"

class MeyersSingleton
{
public:
MeyersSingleton()
: threadShouldExit(false),
myThread(boost::ref(*this) ) {
}

~MeyersSingleton() {
threadShouldExit = true;
myThread.join();
}

static MeyersSingleton& getInstance() {
static MeyersSingleton singletonInstance;
return singletonInstance;
}

void operator()() {
while(!threadShouldExit) {
// my busy worker thread...
sleep(1);
}
}
private:
bool threadShouldExit;
boost::thread myThread;
};

最佳答案

几点:

  • sleep() 在多线程应用程序中不安全,因为它使用了 SIGALRM。请改用 nanosleep()
  • threadShouldExit 已更改且未持有锁,因此它应该是 C++11 原子,或使用 atomic functions读取并设置它的值。

关于c++ - 安全终止 Meyers Singleton 中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16942602/

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