2013-06-05 59 views
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; 
}; 
+1

只是爲了完整性,Linux會發生什麼? :D –

+3

差異很可能是由於代碼中的未定義行爲。 – Casey

+1

我們需要看代碼。 – zch

回答

0

幾點:

  • sleep()是不是安全的多線程應用程序,因爲它使用SIGALRM。改爲使用nanosleep()
  • threadShouldExit更改時未鎖定任何鎖,因此它應該是C++ 11原子,或使用atomic functions來讀取和設置其值。