簡體   English   中英

在C ++中,兩個線程/對象可以安全地在對象集合中做什么?

[英]What can two threads/objects do in a collection of objects safely in C++?

因此,在我開始研究應該與集合中的多個對象進行交互的多線程程序之前,...我想對所涉及的概念有一個清晰的了解...

我主要擔心的是死鎖之類的事情。

說我有一個這樣定義的對象集合...

vector<MyObjects> m_objects;

想象一下,其中填充了100-500個對象。 現在想象一下,這些對象中的每一個都需要具有在某個時刻與所有其他對象進行通信的能力。 用英語來說,他們需要能夠安全地讀寫所有其他對象。

我知道,要寫入一個對象,需要將其鎖定...但是一個對象可以在沒有額外功能的情況下安全地從另一個對象讀取嗎? 如果是這樣,是否可以從正在寫入的鎖定對象中讀取對象? (我對最后一個問題的第一個猜測是不,因為那沒有道理)

如果有人在該主題上有一些容易理解的文章/讀物,我想深入探討一下...

您必須鎖定對象內的共享資源。 每個對象都應在其內部保持其打開狀態,如果該狀態不是系統共享資源的一部分,則無需鎖定它們。

最安全的解決方案是鎖定整個向量,因此一次只能有一個線程可以修改向量及其包含的對象。 但是,問題是,如果在多線程中仍然存在意義,那么...

試圖用其自己的鎖保護向量中的每個對象都可能輕易導致循環依賴,並且有潛在的危險。

想象以下情況,使用上面評論中的Boxer隱喻:

Boxer1嘗試擊中Boxer2。 如果拳打的影響取決於Boxer1的當前運行狀況,則您必須首先鎖定Boxer1,因為您不希望任何人在執行拳打操作時更改其狀況。 同時,您將不得不鎖定Boxer2,因為您不希望任何人在Boxer1打拳時增加他的健康狀況(也許Boxer1會將Boxer2淘汰了...)。

現在,如果Boxer2嘗試同時擊中Boxer2,並嘗試擊中Boxer1,您也將首先鎖定Boxer2,然后再鎖定Boxer1。

因此,如果對您的拳擊手執行操作的兩個線程都到達了他們同時鎖定自己的拳擊手的位置,那么他們將永遠等待鎖定另一個拳擊手,您將陷入僵局。

為防止此類死鎖,您必須制定某種鎖定層次結構。

暫無
暫無

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

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