簡體   English   中英

多線程環境中的析構函數?

[英]Destructor in a multithreaded environment?

我想知道這樣一個課程會發生什么:

class MyClass
{
private:
    std::vector<int> iVector;
    void Worker()
    {
        //Lots of stuff done with iVector
        //adding, removing elements, etc.
    }
}

假設我創建了一個使用iVector並修改它的線程(由其中一個類成員函數調用)。 除了這個worker之外,該類的其他成員函數都沒有讀取或修改這個std :: vector。

一切似乎都很好,因為工作線程是唯一使用iVector的線程。

但是當一個對象實例被銷毀時會發生什么? 即使在工作線程完成后對象被銷毀,也會從主線程調用iVector的析構函數。 這會導致未定義的行為嗎?

謝謝!

首先,我建議在析構函數的線程上運行std::join (或等效的庫)。 這將確保在向量析構函數運行之前正確完成並同步線程。 這很重要,因為向量的生命周期必須超過使用它的線程。

C ++ 11標准,可能是后來的30.3.1.5中的狀態:

5:同步:由*表示的線程的完成與(1.10)相應的成功join()返回同步。 [注意:*上的操作不同步。 - 結束說明]

現在我們必須檢查1.10以獲取更多細節,首先本節說明:

3:根據下面的規則,特定點處的線程T可見的對象的值是對象的初始值,由T分配給對象的值,或由另一個線程分配給該對象的值。

老實說,這很難解析,它沒有詳細說明連接提供什么樣的同步,似乎暗示它只同步線程本身而不是它已訪問的數據。 因此,我會去的安全路線和運行atomic_thread_fence(memory_order_acquire)加入主線程后,和atomic_thread_fence(memory_order_release)在之前它完成應充分保證子線程語義和沒有UB之前發生。

如果執行線程正在使用ivector類成員,而另一個線程使用ivector成員銷毀該對象,則繼續使用ivector類成員會導致未定義的行為。

即使在工作線程完成后對象被銷毀,也會從主線程調用iVector的析構函數。 這會導致未定義的行為嗎?

不,如您所述,這種情況並非未定義的行為。 C ++標准不要求對象被創建對象的同一執行線程銷毀。 一個執行線程增長,調整向量大小,然后消失或停止使用向量,然后一個不同的執行線程破壞整個對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM