我有一種情況,只有在兩個鎖定對象空閒時才應該執行代碼塊。如何在C中使用多個變量鎖定範圍#
我希望會有這樣的:
lock(a,b)
{
// this scope is in critical region
}
然而,似乎一點也不像。所以這是否意味着做到這一點的唯一方法是:
lock(a)
{
lock(b)
{
// this scope is in critical region
}
}
這是否會按預期工作?雖然代碼編譯,但我不知道它是否會達到我期待的目標。
這不會造成鎖定問題嗎?比如說一個對象鎖定了一個,而另一個鎖定了一個,現在你會有一個死鎖,其中object1阻塞了等待b和object2阻止b等待a。我不太熟悉鎖,但這看起來很糟糕。 – Tester101 2010-05-20 13:22:41
這就是爲什麼鎖定順序很重要,因爲迄今爲止所有的答案都提到過。有時你需要有多個鎖,在這種情況下,要使用的一種標準模式是(至少通過約定)強制執行鎖。例如,你會說任何時候你想要獲得鎖,你必須首先獲得一個鎖。導致更多的爭用,但可以防止死鎖。 儘可能地避免這種事情總是更好,但有時候這是必要的。 – Herms 2010-05-20 13:26:07
@ Tester101:是的,我知道如果處理不當,會導致死鎖。 – 2010-05-20 13:52:55