关键部分可以无限期地停止处理器吗?

时间:2014-01-14 13:07:33

标签: c# multithreading locking memory-fences

想象一下,我的代码类似于以下内容:

var obj = new object();
lock (obj)
{
    while (true);
}

由于循环将永远运行,并且循环处于关键部分:

这会占用处理器的所有时间,而不会屈服于另一个线程吗?我相信一旦处理器处于关键部分,它就会在它离开临界区之前被中断,因此锁中的操作是原子的。

是否可以使用此技术来保证您的应用程序始终具有可以运行的核心,并且永远不会等待?

2 个答案:

答案 0 :(得分:2)

  

我相信一旦处理器处于关键部分,它就不可能   中断,直到它离开临界区,以便   锁中的操作是原子的

不,在操作系统级别,线程将被挂起,而另一个线程(来自另一个进程)将被执行。 操作系统调度程序负责根据系统的状态和优先级为系统中执行的各种线程分配CPU时间。

请参阅MSDN(特别是多任务和日程安排章节)。

此外,lock并不代表atomic。它只是意味着没有其他线程可以同时运行同一段代码。

答案 1 :(得分:0)

线程将永远忙碌。但是这与线程调度和中断无关。如果可以防止线程从用户模式中被取消调度,则可以轻松地从非特权进程中杀死整个系统。

默认情况下,自动管理线程与CPU内核的对应关系。你不能保留一个核心。这也不是必需的。