2010-03-08 37 views
13

由於遺留原因,我需要使用入侵指針,因爲我需要將原始指針轉換爲智能指針的能力。有沒有boost :: weak_intrusive_pointer?

但是我注意到沒有微弱的侵入指針來提升。我確實在boost線程列表上找到了一個關於它的討論,但沒有具體的。

有誰知道弱介入指針的線程安全實現?

由於 富

回答

10

這沒有任何意義。

詳細說明:weak_ptr指向shared_ptr所做的同一個counter對象實例。當shared_ptr超出範圍時,counter的實例停留(有效計數爲0),這允許weak_ptr實例檢查它們是否有效地指向釋放的對象。

使用侵入計數,計數器集成在對象內。當計數達到0時,該對象通常會被回收或刪除...但點是計數器不再可用。理由是這允許更高效的存儲(1個單塊)和更高的速度(緩存局部性)。

如果您需要弱引用計數並且不關心侵入計數的好處,則可以使用shared_ptrweak_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_ptrweak_ptr這是線程安全的;)

+0

我的想法是將共享ptr和弱ptr使用的共享對象嵌入到主機對象中,並且intrusive_weak_ptr(如果存在的話)將以與weak_ptr相同的方式使用它。當沒有更多的引用時,我仍然需要刪除對象的功能。另外我需要弱引用。 – Rich 2010-03-08 13:46:18

+0

我認爲你不明白我的觀點:那正是我所提議的。 「計數」對象是「入侵式」計數的,我只是將計數器從普通整數更改爲指向整數的指針。至於你的'intrusive_weak_ptr'這就是我所說的'WeakHandle'。 – 2010-03-08 15:00:30

+0

啊,我想我和你在一起。所以我會像普通一樣使用一個入侵指針,但是當intrusive_ptr_add_ref被調用時,我從共享指針引用int作爲我的計數。當它達到零時,對象被釋放,但是任何弱引用都維持一個指向int的指針。那是對的嗎? – Rich 2010-03-08 15:11:19

4

當前實現侵入指針的是使用參考計數器。所以刪除對象刪除也會刪除計數器,所以weak_intrusive_pointer永遠不會知道該對象已被刪除。

如果您需要從this獲得weak_ptr,那麼您可能搜索了boost::enable_shared_from_this<T>

3

我真的不喜歡無論是以前的答案如此的:

不,我不知道實現的,但我認爲這是可能的。 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(緩存優化,第三方入侵(強)引用計數的重用,強和弱指針替代指針大小)的基本好處,同時主要在弱引用路徑中添加額外的工作。

相關問題