在 C++ 中进入临界区和上下文切换

M.R*_*R.M 5 c++ winapi multithreading critical-section context-switching

我是线程编程的新手(目前需要在公司项目中使用 win32 和 c++),我只是想问一下进入临界区是否意味着没有上下文切换?这是否意味着线程将锁定资源直到它离开临界区?

另外,我目前正在阅读“Win32 中的多线程应用程序”一书,这本书看起来不错,但是对于新手学习 Win32 中的线程,是否有更好的阅读和更新的书?

非常感谢提前^_^

Jon*_*art 4

你只是一个用户模式进程,你无法阻止操作系统上下文切换到另一个进程。这意味着进程中的任何其他线程都无法进入临界区,直到第一个线程离开它。

来自MSDN(重点是我的):

线程使用EnterCriticalSectionorTryEnterCriticalSection函数来请求临界区的所有权。它使用该LeaveCriticalSection函数来释放关键部分的所有权。如果临界区对象当前由另一个线程拥有,EnterCriticalSection 则无限期地等待所有权

又说EnterCriticalSection

等待指定临界区对象的所有权。当调用线程被授予所有权时,该函数返回。

回答“这是否会阻止线程之间的上下文切换”的问题。不,嗯,不是真的。假设您有两个线程ABA呼叫EnterCriticalSection并进入CS。当他在 CS 中使用共享资源时,操作系统仍然可以上下文切换到线程BB将像以前一样继续奔跑,直到接到电话EnterCriticalSection,此时他将阻塞。

现在如何实现这种阻止实际上取决于 Windows。但最有可能的是,操作系统不会“旋转”(我可以输入吗?不,现在?不,现在?不),而是将该线程放入“阻塞”队列,并且不会调度该线程,直到他正在等待的事情( CS)可用。那时,他将被安排,并且呼叫EnterCriticalSection将成功。

也可以看看