2012-05-07 99 views
3

我有一個使用升壓線程的程序。該程序具有啓動和停止功能。當程序啓動時,我創建一個提升線程來進行一些處理。當程序停止時,我調用加入這個線程並刪除線程的指針。我的程序第一次正確啓動和停止;然而,當我嘗試啓動我的程序我第二次失敗升壓內的斷言(當newing處理線程)和下面是我的屏幕上輸出升壓線程錯誤

/root/src/boost.cmake/libs/thread/src/pthread/once.cpp:46: unsigned long &boost::detail::get_once_per_thread_epoch(): Assertion`!pthread_setspecific(epoch_tss_key,data)' failed. 

我知道,我的加入是否正常工作,因爲當處理線程退出時,我會向控制檯輸出一條消息。有誰知道爲什麼會發生這種情況?

一個額外的說明...我玩過我的代碼一點點和我用來清理我的助推線程的方法似乎在我的程序的其他部分(例如,如果我創建在父類中的boost :: thread)。但是,它每次都會在子類(這是一個抽象類)中失敗。

我的啓動和停止方法看起來像這樣...

void ThreadMethod() 
    { 
     while(_runningThread) 
     { 
     } 
    } 
void Start() 
    { 
    _runningThread = true; 
    _thread = boost::make_shared<boost::thread>(&TestChildVirtualClass::ThreadMethod, this); 
    }; 
    void Stop() 
    { 
    _runningThread = false; 
    _thread->join(); 
    if(_thread) 
    { 
     _thread.reset(); 
    } 
    }; 

但是,我無法在測試計劃重建這個問題(雖然它發生,每次在我實際的程序)。

+1

調試程序並在問題中引用的代碼上放置一個斷點。看來它應該每個線程調用一次,所以* second *調用應該識別你的問題。 –

+4

成功的連接意味着線程已經完成執行。要再次執行,您需要創建另一個線程。 –

+0

您正在使用哪種平臺/編譯器和增強版本? –

回答

0

錯誤可能是Boost.Thread上的一個錯誤,因爲call_once實現中有一些漏洞(#5752 boost :: call_once()在某些平臺上不可靠 - 請參閱https://svn.boost.org/trac/boost/ticket/5752)。這當然取決於您運行程序的平臺。

當然,我可能錯了。

您還應該保護對_runningThread的訪問。