c# – 哪个线程是第一个进入临界区的?

假设多个线程定期执行下面的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将很容易得到更晚的时间戳但是首先进入关键部分.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么