多執行緒引用計數如何釋放?

時間 2021-05-31 12:08:54

1樓:Cyandev

首先,引用計數所在的記憶體的任何訪問操作必須是原子的,當然你可以加鎖或者用相關 Atomic 函式。

引用使用權轉移的時候不能存在引用計數已經為零的情況,既然你已經讓 thread 2 先執行了,所有記憶體都會釋放,thread 1 必然會出現 Bad Access 的情況,Objective-C 裡的 autorelease 可以讓引用計數變為零且在下乙個 runloop 之前不會被釋放,但是你的這個程式在引用計數為零時會立即釋放相應記憶體,這就是問題所在。

2樓:靈劍

對,我看別人也提到了,在你這裡我最感到困惑的一件事情是引用計數會在減到0之後(或者同時)又增加回到0以上,這即使是在單執行緒當中也是有問題的,也會先釋放掉資源。任何時候如果你要在Release自己的引用之前將引用潛在性地移交給別人,你都應該先進性一次引用計數遞增的操作。如果說你需要跨執行緒進行非同步的轉移,那麼你應該在轉出之前(比如放進佇列之前)就為接受執行緒進行一次AddRef,這樣才能保證自己的Release是安全的。

否則就算你是單執行緒,你也有可能把還放在佇列裡的資源給Release掉了。哪怕資源是在佇列裡放著,你也得給它提供乙個額外的引用計數才對。

如果說你的另外乙個執行緒在沒有自己的引用計數的情況下去讀取了乙個資源(哪怕他立即想要獲取乙個引用計數),這說明你的執行緒借用了別人的乙個引用,那出借的一方自然就需要保證借出去的引用在還回來之前不能Release,這中間需要加鎖,但我們本來用引用計數就是為了共享,那麼再引入一層鎖互斥就很奇怪了。

正常來說,如果你要在兩個執行緒當中共享乙個帶引用計數的物件,你需要有乙個傳遞的機制,舉個例子來說,你將物件引用放在乙個共享的位置上,同時AddRef(這個Ref是你這個共享位置的引用計數),然後通知另乙個執行緒;另乙個執行緒取走這個Ref,把這個引用計數轉移到自己手上。注意在通知另乙個執行緒之前就要AddRef,而不是在另乙個執行緒取的時候才Add,這是因為你放在共享位置的那個引用也需要乙個自己的引用計數,來保證另乙個執行緒取走之前,這個物件的引用計數不會減到0。

3樓:陳碩

python爬蟲如何利用多執行緒?

zhangxiaoyang 初心是想爬的更快,但多執行緒 多程序並不能從根本上解決問題,更好的姿勢是非同步,具體實現可以基於協程,也可以實現自己的非同步抓取框架,懶得做也有現成的,比如Scrapy。相信題主更關心的是,什麼是非同步,為什麼非同步好用,請閱讀下面的小故事。故事時間 鏡頭一 有乙個快遞公...

在編寫多執行緒光柵器時如何保證FrameBuffer的執行緒安全?

回D 如果用的是c 有現成的鎖可以直接掛上去,只要把可能衝突的寫入的地方掛鎖,也就是寫buffer的地方 這樣就可以實現低效但可用的多執行緒了 我拿c 寫的時候,就是給寫buffer的函式掛鎖,然後把所有三角形分成5組,乙個執行緒一組三角形。同時開始跑,只有同時調到寫buffer的函式時會衝突,衝突...

多執行緒非同步處理情況下,如何保證區域性順序處理,有什麼模型可以提高處理效率,又能保證順序?

二大王 蟹腰。琢磨了下,如果要將乙個人說的話按順序處理,那為何還要啟動多個執行緒處理乙個人的輸出?假設有10個人同時在說話,每個人的話一句一句的按順序輸出,要求並行處理這10個人的輸出,同時保證單個人的輸出處理順序。如果啟動50個執行緒,每個人說的話用5個執行緒來處理,同時保證這5個執行緒是按順序序...