[英]safely terminating a thread in Meyers Singleton
我在Meyers'Singleton内部运行了一个Boost线程。 在我的程序运行期间,它会愉快地运行。
当我的Singleton的析构函数被调用时(当程序从内存中加载时),我设置了一个标志,以便线程应退出其循环并触发对thread.join()
的调用。
现在,在Windows上,调用thread.join()
会导致错误的访问异常。 但是在Mac上, 不调用thread.join()
会引发错误的访问异常!
谁能阐明这两个操作系统之间的行为差异,并且/或者提供有关如何安全终止我的线程的说明?
编辑:如果我在简单的命令行应用程序中运行此代码,则该代码在Mac和Windows上均适用。 是否调用myThread.join()
没有关系!
当以共享库的形式运行时会出现问题...在Mac上发生内存异常,是在我尝试第二次重新加载dylib并忽略对myThread.join()
的调用时myThread.join()
例:
#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原子的,或者使用原子的函数读取和设置其值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.