在c ++中输入关键部分和上下文切换

时间:2013-10-24 06:57:48

标签: c++ multithreading winapi critical-section context-switching

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

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

非常感谢提前^ _ ^

1 个答案:

答案 0 :(得分:4)

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

来自MSDN(强调我的):

  

线程使用EnterCriticalSectionTryEnterCriticalSection函数来请求关键部分的所有权。它使用LeaveCriticalSection函数释放关键部分的所有权。如果关键部分对象当前归另一个线程所有,EnterCriticalSection 无限期等待所有权

再次,EnterCriticalSection说:

  

等待指定的关键部分对象的所有权。当调用线程被授予所有权时,该函数返回。

回答“这会阻止线程之间的上下文切换”的问题。不,嗯,不是真的。假设您有两个主题, A B A 调用EnterCriticalSection并进入CS。当他在CS中使用共享资源时,操作系统仍然可以将上下文切换到线程 B B 会像以前一样继续运行,直到他进入EnterCriticalSection来电,此时他会阻止。

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

另见