C 多執行緒環境下里如何精確獲取shared ptr的引用計數?

時間 2021-05-07 03:27:26

1樓:「已登出」

根據文件的意思,不準確的原因是因為別的執行緒也許還沒有構建完成,或者在weakptr::lock()未完成,那麼是否意味著可以通過保證同時只有乙個執行緒建立shared_ptr來保證use_count()返回精確值

2樓:禽牙

不精確的原因文件本身已經說得很清楚了,那是假設不同執行緒都在操作同乙個shared_ptr的情況。這種情況要是能夠精確獲得才是奇怪了,真要精確獲得就再加一把鎖。

3樓:洪春濤

為什麼想取得引用計數呢?引用計數是多執行緒共享的,即使你拿到了,等你判斷的時候又被改了怎麼辦?

shared_ptr是為了保證物件會被析構,防止memory leak的,所以它其實並不需要精確計數,只需要在引用計數為0的情況下保證析構物件就行。在多核情況下你要精確計數就必須得用atomic操作,而atomic是很貴的。所以乙個很自然的優化就是在shared_ptr上放乙個全域性計數,然後在本執行緒做個buffer count,本執行緒計數從0到1的時候和從1到0的時候用atomic去操作全域性計數,而其它時候只需要操作本執行緒計數。

這樣就帶來乙個問題,那就是你沒辦法精確統計目前到底有多少個計數,因為每個執行緒都會有buffer count。所以shared_ptr::use_count才只有在返回0和1的情況下是確定的(至少在你做那個atomic操作的時候是確定的),其它時候都是不確定的。

STL多執行緒在linux環境下效能急劇下降,求解答?

用排除法 1 先排除多執行緒的問題。方法 在兩台機器上分別用單執行緒測試。2 排除檔案讀寫問題。方法 將taskThread裡面的任務替換成其它的純計算純記憶體操作。 egmkang wang 為什麼C getline讀取速度比C readline讀取速度慢這麼多?如何提高?egmkang wang...

學習c 多執行緒程式設計主要用pthread還是c 11中的thread類?

諸葛不亮 標準庫執行緒可以get id拿到pid t或者HANDLE,不影響你使用native api。然後用std方便的部分用std寫,用native方便的部分用native寫,這就叫合併兩個生態。反之則不行。完畢。 兩種都應該掌握 std thread在Linux平台上不過是對pthread的一...

C 中使用thread庫開多執行緒可以開無限多個嗎?

Seeman 不可以,在作業系統中有兩個資源會限制開子執行緒的個數。首先每個子執行緒有乙個file descriptor windows裡面叫handle 作業系統分給每個程序的fd個數有上限的。其次每個子執行緒會占用stack,編譯時,每個程序stack的大小是有限制的,編譯選項可以設定stack...