Lorsque plusieurs threads demande un verrou sur le même objet, ne le CLR garantir que les verrous seront acquises dans l'ordre où ils ont été demandés?
J'ai écrit un test pour voir si c'était vrai, et il semble indiquer que oui, mais je ne sais pas si c'est définitif.
class LockSequence
{
private static readonly object _lock = new object();
private static DateTime _dueTime;
public static void Test()
{
var states = new List<State>();
_dueTime = DateTime.Now.AddSeconds(5);
for (int i = 0; i < 10; i++)
{
var state = new State {Index = i};
ThreadPool.QueueUserWorkItem(Go, state);
states.Add(state);
Thread.Sleep(100);
}
states.ForEach(s => s.Sync.WaitOne());
states.ForEach(s => s.Sync.Close());
}
private static void Go(object state)
{
var s = (State) state;
Console.WriteLine("Go entered: " + s.Index);
lock (_lock)
{
Console.WriteLine("{0,2} got lock", s.Index);
if (_dueTime > DateTime.Now)
{
var time = _dueTime - DateTime.Now;
Console.WriteLine("{0,2} sleeping for {1} ticks", s.Index, time.Ticks);
Thread.Sleep(time);
}
Console.WriteLine("{0,2} exiting lock", s.Index);
}
s.Sync.Set();
}
private class State
{
public int Index;
public readonly ManualResetEvent Sync = new ManualResetEvent(false);
}
}
Impressions:
Allez entrée: 0
0 obtenu de verrouillage
0 de couchage pour 49979998 tiques
Aller entrées: 1
Allez entrée: 2
Allez entrée: 3
Allez entrée: 4
Allez entrée: 5
Allez entrée: 6
Allez entrée: 7
Allez entrée: 8
Allez entrée: 9
0 la sortie de verrouillage
1 obtenu de verrouillage
1 couchage pour 5001 tiques
1 sortie de verrouillage
2 obtenu de verrouillage
2 couchage pour 5001 tiques
2 sortie de verrouillage
3 obtenu de verrouillage
3 de couchage pour 5001 tiques
3 sortie de verrouillage
4 obtenu de verrouillage
4 couchage pour 5001 tiques
4 sortie de verrouillage
5 obtenu de verrouillage
5 couchage pour 5001 tiques
5 sortie de verrouillage
6 obtenu de verrouillage
6 sortie de verrouillage
7 obtenu de verrouillage
7 sortie de verrouillage
8 obtenu de verrouillage
8 sortie de verrouillage
9 obtenu de verrouillage
9 la sortie de verrouillage