我需要在一段時間只有一個線程運行代碼(單個資源鎖定)。Lock語句如何確定授予對象訪問的順序?
lock(object)
聲明在C#中允許這樣做。但是,它並不保留鎖的請求順序。
例如,考慮下面在那裏編號線程試圖在訂單上掛鎖鎖定100個threadstarts:
for (int i = 0; i < 100; i++)
{
(new Thread(delegate(object index)
{
int name = (int) index;
byte[] len = new byte[2];
Console.WriteLine(string.Format("Thread:{0} going for lock. ",
name));
lock (padlock)
{
rnd.GetBytes(len);
ushort l = BitConverter.ToUInt16(len, 0);
Console.WriteLine(string.Format("Thread:{0} sleeping: {1}",
name, l));
Thread.Sleep(l);
}
})).Start(i);
的訪問的實際給予不完美順序(1-> 100)或NOT FIFO 。但是,似乎確實有一個「提早出局」的EIEO模式(可能由堆運行?)。
問題是:什麼決定了鎖授予順序和能不能在不捱餓不吉利的線程依賴?
更新:this answer解釋它。這裏是相關報價(喬·達菲的在Windows併發編程):
由於顯示器使用內核對象的內部,他們表現出相同的 大致-FIFO行爲的OS同步機制也 展覽(在前面的章節中描述)。顯示器是不公平的,所以如果 另一個線程嘗試之前喚醒等待 線程試圖獲取鎖獲取鎖,偷偷摸摸線程被允許 獲取鎖。
http://stackoverflow.com/q/5111779/34397的http://計算器.COM/q /34397分之4228864 – SLaks
@SLaks在第二個的喬恩斯基特答案呈現此爲重複。 – MandoMando
哈,顯然你在和我同時看着喬的報價。 –