假设多个线程定期执行下面的DoWork()方法.假设在某个时刻,两个线程几乎同时开始执行此方法,因此两个本地时间戳对象中的一个比另一个更大.
ICollection collection = // ... public void DoWork() { DateTime timestamp = DateTime.Now; lock(collection.SyncRoot) { // critical section } }
如果线程A的特征在于时间戳等于t1,而线程B的特征在于时间戳t2等于t1 1 tick,则线程A将首先需要访问临界区.
.NET如何通过多个线程管理对关键部分的访问?它是否将访问请求放入队列中,以便它们按时间顺序排列?换句话说,是否根据线程访问请求的顺序保证对关键部分的访问?
解决方法
绝对不保证线程执行的顺序以及首先获得关键部分的线程.
请注意,即使线程的优先级也不能保证顺序 – 不同的内核/ cpu可以在完全相同的时间执行不同优先级的线程,并且任何线程都可以首先到达并获得关键部分.
注2:线程也可以在任意时刻被调度执行/等待,因此同一线程中的两个不同操作彼此相邻的事实并不意味着它们将一个接一个地执行而没有延迟.在你的情况下,这意味着一旦获得时间戳就可以停止线程A,并且稍后安排执行的线程B将很容易得到更晚的时间戳但是首先进入关键部分.