2011-01-21 132 views
2

在我的代碼中,我使用boost::threads,我有一個類通過一個稱爲fnThread()的成員函數運行線程。在這個fnThread()中我想創建一個shared_from_this()並將它傳遞給有信號的收聽方。但行boost::shared_ptr<foo> p = shared_from_this()拋出一個異常如下;shared_from_this()從另一個線程(一個成員線程函數)

boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> > at memory location 0x04c2f720. 

有問題的命令是shared_from_this()。從另一個線索創建shared_from_this()是否違法或我做錯了什麼?任何幫助表示讚賞。謝謝 ! PS:我計劃改變我的信號參數爲普通指針,因爲它不會影響我的結構。但我贊成shared_ptr <>,我想聽取有關該決定的任何意見。也許這對於這種特殊情況是一個不好的選擇。你有什麼建議?

編輯:

下面是一個簡單的類,以測試

class foo : public boost::enable_shared_from_this<foo> 
{ 
public: 
    int start() 
    { 
     foo_thread.reset(new boost::thread(boost::bind(&foo::fn_foo_thread, this))); 

     return 0; 
    } 

    ~foo() 
    { 
     if (foo_thread->joinable()) 
      foo_thread->join(); 
    } 

private: 
    boost::scoped_ptr<boost::thread> foo_thread; 

    void fn_foo_thread() 
    { 
     boost::shared_ptr<foo> p = shared_from_this(); 
     std::cout << "foo thread terminated. \n" << std::endl; 
    } 
}; 
+0

你是什麼意思,「創建'shared_from_this()'?」 –

+0

我的意思是將'boost :: shared_ptr '改爲'this' – fgungor

+1

請向我們展示實例化'foo'並調用'start'的代碼。錯誤可能在那裏。 – Macke

回答

0

你可能要考慮改變boost::shared_ptr<>boost::intrusive_ptr<>。主要區別在於boost::intrusive_ptr<>表明引用計數器存儲在對象內部(儘管可以將其存儲在其他地方)。使用嵌入式引用計數器,您可以根據需要在構造函數或純指針中構造一個boost::intrusive_ptr<>(但不要在析構函數中使用boost::intrusive_ptr<>)。

4

shared_from_this可以從其他線程使用。當不存在shared_ptrthis(顧名思義)時引發bad_weak_ptr異常。您的問題很可能存在於代碼中的其他地方。

+0

怎麼樣從多個線程同時調用一個對象上的'shared_from_this'? – updogliu

+1

'shared_from_this'是線程安全的。 –

2

正如@Sam Miller所提到的,這個問題在其他地方存在。我可以想象你宣佈foo是一個scoped_ptr<foo>。通過這樣做,shared_from_this不可能返回有效的共享指針,因爲boost::scoped_ptr類型的智能指針不能傳輸對象的所有權。這裏是你例外的原因。

0

shared_from_this()無法在構造函數完成之前或在析構函數啓動之後調用。