最近我開始在一個傳統項目上工作,並試圖修復段錯誤(雙刪除)。它們中的很多正在發生在boost::shared_ptr
析構函數或operator=
(在包含shared_ptr的對象上)。代碼包含shared_ptr-s的大量使用,包括複製,重置(),分配等。根據boost docs,我們沒有有效的用法 - 它在多個線程中不能安全地銷燬/複製/重置相同的shared_ptr。boost :: shared_ptr drop-in replacement
每次鎖定似乎都不可能,所以即時搜索boost :: shared_ptr的插入替換。所以問題是:如果我用std::shared_ptr
或std::tr1::shared_ptr
替換所有boost::shared_ptr
將解決此問題?看起來tr1是更安全的版本,但對我來說並不明確。第二個問題 - C++ 0x版本比tr1更好嗎? (注意,我們有GCC 4.4.6,並且不能升級)
Accoring到gcc docs,C++ 11的std :: shared_ptr的應該解決這個問題了,但是我不知道GCC4.4版本...
UPD :只要maked實驗,現在我知道所有的3個實現沒有段錯誤的代碼(GCC 4.4)..看來我應該做的自定義類或也許其他的解決辦法...
#include <iostream>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
typedef boost::shared_ptr<int> ptrtype;
ptrtype p(new int);
void test() {
for(long i=0; i<1000000; ++i) {
ptrtype p1 = p;
p = ptrtype();
p.reset(new int);
}
}
int main() {
boost::thread_group tg;
for(int i=0; i<100; ++i) tg.add_thread(new boost::thread(test));
tg.join_all();
std::cout << "Normal exit\n";
return 0;
}
boost :: shared_ptr非常穩定。我不認爲用另一種實現替換它會「解決」任何事情。如果你看到兩次刪除,那麼你會繼續看到這些,直到你找到並修復你的錯誤。 – Bukes 2013-02-27 19:28:03
「每次鎖定似乎都不可能」表示您有線程問題。改變智能指針的實現並不會爲你購買任何東西。 boost :: shared_ptr不是越野車。 – 2013-02-27 19:28:59
你在尋找一個線程安全的共享指針嗎? – 2013-02-27 19:31:35