2
我有一個在Meyers的Singleton內部運行的boost線程。它在我的計劃期間愉快地運行。安全地終止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;
};
只是爲了完整性,Linux會發生什麼? :D –
差異很可能是由於代碼中的未定義行爲。 – Casey
我們需要看代碼。 – zch