我有一個類在我的項目包含4個向量線程同步設計
m_vecA;
m_vecB;
m_vecC;
m_vecD;
可以在不同的threads.I訪問可以使用一個臨界區和保護所有這些向量與它這些載體。
或者每個資源有4個關鍵部分是好主意嗎?如果我對所有資源使用一個關鍵部分,我會看到死鎖問題。
一般來說,一個資源有一個關鍵部分或者每個類可以有一個關鍵部分的設計是否好?
我有一個類在我的項目包含4個向量線程同步設計
m_vecA;
m_vecB;
m_vecC;
m_vecD;
可以在不同的threads.I訪問可以使用一個臨界區和保護所有這些向量與它這些載體。
或者每個資源有4個關鍵部分是好主意嗎?如果我對所有資源使用一個關鍵部分,我會看到死鎖問題。
一般來說,一個資源有一個關鍵部分或者每個類可以有一個關鍵部分的設計是否好?
有4個關鍵部分,但:
關鍵是要始終接入(鎖定),他們以相同的順序,
say A then B then C then D
否則,你可以死鎖,如果:
thread one locks A and is waiting for B,
and thread 2 locks B and is waiting on A
如果您強制執行關鍵部分,則不會發生這種情況
@polkadotcadaver我認爲它仍然是一個很好的一般經驗法則! –
對於需要同時訪問的每個項目,您應該有一個關鍵部分。
基本上,所有四個關鍵部分都意味着如果一個線程被鎖定,它們都不能被其他線程讀取或寫入。每個關鍵部分都意味着最多四個線程可以同時訪問它們。
您可以通過引入鎖定順序來避免死鎖。如果你鎖定某件東西,那麼你應該獲得更高訂購號的鎖。如果所有鎖都釋放,那麼您可以再次鎖定任何東西。 – Notinlist
如果您有4個se獨立的,獨立的資源,並且它們彼此之間的關係並不重要,你可能想單獨和獨立地保護它們。但是,如果這4個向量一起表示單個邏輯資源,並且它們必須始終以原子方式更新並相對於對方保持有效,那麼您需要將它們作爲一個組來保護。
或者每個資源有4個關鍵部分是好主意嗎? 如果我對所有資源使用一個關鍵部分,我看到死鎖 問題。
正如在其他的答案中提到,會出現這種情況,如果你的線程鎖定在一個時間超過一個資源,而不是總是將它們鎖定在相同的順序。
請記住,如果線程始終需要鎖定所有四個向量以與它們一起工作,則不需要單獨保護它們,而是作爲單個組來保護它們。
一般來說,一個 資源有一個關鍵部分的好設計,還是我們每個類可以有一個關鍵部分?
這又取決於每個向量是代表一個完全獨立的資源,還是所有4個向量作爲一個組是否是單個邏輯資源。你一起把它們放在課堂上的事實似乎表明後者。如果這是真的,那麼你應該有一個鎖,保護他們所有人作爲一個組。
一個挑剔。關鍵部分不適用於資源 - 關鍵部分是對該資源的訪問。 – polkadotcadaver