c# - 哪个线程最先进入临界区?

标签 c# .net multithreading

假设多个线程周期性地执行下面的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:线程也可以被安排在任意时刻执行/等待,所以同一个线程中的2个不同操作彼此相邻并不意味着它们会一个接一个地执行而不会延迟之间。在您的情况下,这意味着线程 A 可能会在获得时间戳后立即停止,而计划在一段时间后执行的线程 B 将很容易获得稍后的时间戳,但首先到达关键部分。

关于c# - 哪个线程最先进入临界区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12286628/

相关文章:

c# - 我应该将 StringContent 类用于什么目的?

c# - 在Visual Studio 2012中有一种在调试C#时使用F#REPL的方法

c# - 如何在 C# 控制台项目中授予写入权限

c# - WPF 列表框在 SelectedItem 之后显示下一个元素

c# - ArgumentException 多个参数和嵌套参数的 ParamName 约定

java - HandlerThread 的线程 ID - android

c# - 如何覆盖 ContentControlThemeFontFamily

c# - 如何在 C# 中合并/提取重复的代码结构

Android:线程不并行运行

multithreading - NSOperation 子类中的 NSTimer