我在 Meyers 的 Singleton 中运行了一个 boost 线程。它在我的程序期间愉快地运行。
当我的 Singleton 的析构函数被调用时(当程序加载到内存不足时),我设置了一个标志,以便线程应该退出它的循环并触发对thread.join()
.
现在,在 Windows 上,调用thread.join()
会导致错误的访问异常。但是在 Mac 上,不调用thread.join()
会引发错误的访问异常!
谁能阐明这两个操作系统之间的这种行为差异,和/或提供有关如何安全终止我的线程的说明?
编辑:如果我在一个简单的命令行应用程序中运行此代码,它可以在 Mac 和 Windows 上运行。打不打都无所谓myThread.join()
!
作为共享库运行会出现问题......当我第二次尝试重新加载 dylib 并且我省略了对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;
};