所以想象我有类似于以下的代码:
var obj = new object();
lock (obj)
{
while (true);
}
由于循环将永远运行,并且由于循环处于关键部分:
这会占用处理器的所有时间,永远不会让步给另一个线程吗?我相信一旦处理器处于临界区,它就不能被中断,直到它离开临界区,所以锁中的操作是原子的。
这种技术可以用来保证你的应用程序总是有一个内核可以运行,并且永远不会等待吗?
所以想象我有类似于以下的代码:
var obj = new object();
lock (obj)
{
while (true);
}
由于循环将永远运行,并且由于循环处于关键部分:
这会占用处理器的所有时间,永远不会让步给另一个线程吗?我相信一旦处理器处于临界区,它就不能被中断,直到它离开临界区,所以锁中的操作是原子的。
这种技术可以用来保证你的应用程序总是有一个内核可以运行,并且永远不会等待吗?
我相信一旦处理器处于临界区,它就不能被中断,直到它离开临界区,所以锁中的操作是原子的
不,在操作系统级别,线程将被挂起,而另一个线程(来自另一个进程或不是来自另一个进程)将被执行。操作系统调度程序负责根据它们的状态和优先级为系统中执行的各种线程分配 CPU 时间。
请参阅MSDN(尤其是多任务和调度章节)。
还有,lock
不代表atomic
。这只是意味着没有其他线程可以同时运行同一段代码。
The thread will be busy forever. However this has nothing to do with thread scheduling and interruption. If it was possible to prevent a thread from being descheduled from user mode you could easily kill an entire system from an unprivileged process.
The correspondence of threads to CPU cores is by default automatically managed. You cannot reserve a core. This is not necessary either.