![](/img/trans.png)
[英]How do I properly cancel a Boost deadline_timer from a destructor (in a multithreaded environment)?
[英]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.