由於遺留原因,我需要使用入侵指針,因爲我需要將原始指針轉換爲智能指針的能力。有沒有boost :: weak_intrusive_pointer?
但是我注意到沒有微弱的侵入指針來提升。我確實在boost線程列表上找到了一個關於它的討論,但沒有具體的。
有誰知道弱介入指針的線程安全實現?
由於 富
由於遺留原因,我需要使用入侵指針,因爲我需要將原始指針轉換爲智能指針的能力。有沒有boost :: weak_intrusive_pointer?
但是我注意到沒有微弱的侵入指針來提升。我確實在boost線程列表上找到了一個關於它的討論,但沒有具體的。
有誰知道弱介入指針的線程安全實現?
由於 富
這沒有任何意義。
詳細說明:weak_ptr
指向shared_ptr
所做的同一個counter
對象實例。當shared_ptr
超出範圍時,counter
的實例停留(有效計數爲0),這允許weak_ptr
實例檢查它們是否有效地指向釋放的對象。
使用侵入計數,計數器集成在對象內。當計數達到0時,該對象通常會被回收或刪除...但點是計數器不再可用。理由是這允許更高效的存儲(1個單塊)和更高的速度(緩存局部性)。
如果您需要弱引用計數並且不關心侵入計數的好處,則可以使用shared_ptr
和weak_ptr
的組合。
這個想法是從對象中取消關聯計數器。
class Counted
{
// bla
private:
boost::shared_ptr<int> mCounter;
};
現在你可以返回弱手柄:
class WeakHandle
{
public:
explicit WeakHandle(Counted& c): mCounter(c.mCounter), mObject(&c) {}
bool expired() const { return mCounter.expired(); }
private:
boost::weak_ptr<int> mCounter;
Counted* mObject;
};
在這裏,我們deassociate從對象的生命週期計數器的壽命,使之生存的對象的破壞......部分。從而有效地使weak_ptr
成爲可能。
當然,並使用shared_ptr
和weak_ptr
這是線程安全的;)
當前實現侵入指針的是使用參考計數器。所以刪除對象刪除也會刪除計數器,所以weak_intrusive_pointer永遠不會知道該對象已被刪除。
如果您需要從this
獲得weak_ptr,那麼您可能搜索了boost::enable_shared_from_this<T>
。
我真的不喜歡無論是以前的答案如此的:
不,我不知道實現的,但我認爲這是可能的。 shared_ptr的標準實現包含兩個引用計數,一個用於「強」,一個用於「弱」引用,以及指向所指對象的指針。在intrusive_ptr實現中,強計數需要成爲對象的一部分,但弱是不可能的。所以,你似乎可以創建一個「可以弱化」的intrusive_ptr。
定義弱指針助手:
template<class X>
class intrusive_ptr_weak_helper {
long weak_ref_count;
X *target_instance;
};
然後錄製到所述參考計數旁邊的對象:
struct X {
...
intrusive_ptr_weak_helper *ref_weak_helper;
...
long ref_count;
...
};
構建當X:
ref_count = 0;
ref_weak_helper = NULL;
「強」指針intrusive_strong_ptr與intrusive_ptr相同,直到發生刪除。當強ref計數變爲零(刪除發生前):
if (ref_weak_helper != NULL) {
if (ref_weak_helper->weak_ref_count == 0)
delete ref_weak_helper;
else
ref_weak_helper->target_instance = NULL;
}
「弱」的版本,intrusive_weak_ptr,記錄了指針弱幫手,操縱該參考計數,並經由target_instance訪問目標對象指針。當weak_ref_count遞減爲零時,target_instance的狀態決定是否刪除幫助器。
有許多細節丟失(例如併發問題),但是這是shared_ptr和intrusive_ptr的混合。它保持intrusive_ptr(緩存優化,第三方入侵(強)引用計數的重用,強和弱指針替代指針大小)的基本好處,同時主要在弱引用路徑中添加額外的工作。
我的想法是將共享ptr和弱ptr使用的共享對象嵌入到主機對象中,並且intrusive_weak_ptr(如果存在的話)將以與weak_ptr相同的方式使用它。當沒有更多的引用時,我仍然需要刪除對象的功能。另外我需要弱引用。 – Rich 2010-03-08 13:46:18
我認爲你不明白我的觀點:那正是我所提議的。 「計數」對象是「入侵式」計數的,我只是將計數器從普通整數更改爲指向整數的指針。至於你的'intrusive_weak_ptr'這就是我所說的'WeakHandle'。 – 2010-03-08 15:00:30
啊,我想我和你在一起。所以我會像普通一樣使用一個入侵指針,但是當intrusive_ptr_add_ref被調用時,我從共享指針引用int作爲我的計數。當它達到零時,對象被釋放,但是任何弱引用都維持一個指向int的指針。那是對的嗎? – Rich 2010-03-08 15:11:19