我在Meyers‘Singleton里面有一个助推线程。它愉快地运行在我的程序期间。
当调用我的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;
};发布于 2013-09-16 11:22:50
以下几点:
sleep()在多线程应用程序中不安全,因为它使用SIGALRM。使用nanosleep()代替。threadShouldExit被更改时没有锁,所以它应该是一个C++11原子,或者使用原子函数来读取和设置它的值。https://stackoverflow.com/questions/16942602
复制相似问题