2015-01-06 68 views
0

我有以下兩個函數,第一個崩潰但第二個運行正常。 我知道,對於第一個,run()返回時對象被銷燬,但線程仍在執行它的work()函數,這可能會導致未定義的行爲。在boost線程中調用一個類的成員函數

但爲什麼第二個工作?如果我們把這個對象包裝在一個shared_ptr中,它會比那個線程活躍起來?

請賜教。謝謝。

void run() { 
    Object object(); 
    boost::thread t(&Object::work, &object); 
} 

void run() { 
    std::shared_ptr<Object> object_(new Object()); 
    boost::thread t(&Object::work, object); 
} 

回答

1

是的。按值存儲參數。

這意味着共享指針的副本將一直存在,直到bind表達式失效。這樣可以保持Object的狀態。

有意思的是:boost::bind支持爲shared_ptr<T>綁定成員函數的參數thisstd::bind沒有此功能(還?)

+0

其中是綁定表達式? t(&Object :: work,&object)隱式調用bind? – jiawen

+0

@jiawen是的。對不起,這可能會更清晰。實際上,不需要使用'boost :: bind',但是'std :: thread'構造'std :: bind'是以相同的方式指定的。這也意味着如果你想綁定引用,你需要'boost :: ref(object)'(或'std :: ref(object)') – sehe

相關問題