我想检查它是否真的如此:当一个特定的线程在一个关键部分内时,程序中不在关键部分的其他线程被阻止执行?
我发布了这个问题,因为有些人认为互斥锁比临界区更好,因为这最后可能会阻止其他未使用临界区的线程。
看一下这个网址:http://www.careerride.com/VC++-critical-section-mutex-and-semaphore.aspx这是真的吗?
答案 0 :(得分:2)
首先,并非所有线程都被阻止。 只有那些被阻止的线程才想进入同一个关键部分。
你的问题是你想检查线程的工作。
我的解释将集中在使用Visual Studio IDE,因为您询问了Windows关键部分。
有一个全局变量int loop = 1; 有关键部分只有代码while(循环); (无限循环)
程序中至少有2个线程。在调试器中运行代码。 请参阅IDE中的线程视图,您将看到一个线程在while(循环)时被卡住。
冻结该线程并切换到另一个线程。只需运行另一个线程,您将看到它不会进一步移动,它将继续尝试进入关键部分。
现在从调试器的监视视图将循环的值更改为0。 当持有关键部分的第一个线程被冻结时,仍然没有任何改变。现在只需将断点放在行(while)并运行冻结线程,然后您将看到,因为我们已将循环的值更改为0,持有临界区的线程将退出临界区。
哇,另一个线程将在断点处停止,现在它已进入临界区。
因此,要扩展范围,请在程序中添加3个不使用临界区的线程。
运行程序,您会发现上述情况仅适用于具有临界区的线程,但第三个不使用临界区的线程只运行并完成而没有任何问题。
答案 1 :(得分:2)
让我试着让它变得简单。
你在路上行驶,然后你看到一个红色信号。你必须停下来,直到其他人使用过境点。您的等待与城市,国家或整个世界的任何其他道路无关。
如果伦敦的信号是绿色或红色,并且您正在等待旧金山的特定信号 - 如果伦敦的那个信号变绿,那么这真的无关紧要(你不会允许通过)。伦敦的红色信号都不能阻止你不穿过信号。
同样,这些信号都不会阻止高速公路上的任何车辆。其他车辆不会被您正在等待的信号阻止(它们是OS透视图中的自由线程)。
假设特定信号上的所有车辆的集合是一个线程。然后在四个交叉信号上,将有三个线程等待信号变为绿色。只有一个线程(一组车辆)可以继续进行(利用道路),所有其他3个(或更多)线程必须等待。
这就是CS和互斥体的用途。如果您被EnterCriticalSection
或WaitForSingleObject
屏蔽,则表示您正在等待该信号灯变为绿色(等待线程)。
答案 2 :(得分:0)
一般而言,没有。除非他们试图进入受同一CRITICAL_SECTION保护的区域,否则其他线程不受影响。这些线程可能会被阻塞,直到关键部分可用,具体取决于您尝试输入和何时输入。
进入临界区的第一个没有问题,但是一旦线程进入,在关键部分离开之前,其他任何线程都不会进入。
尝试进入“A”占用的临界区的线程“B”将阻塞,直到“A”退出临界区,除非“B”首先测试允许它们进入,例如{{3并且选择做别的事而不是等待。
我还建议,如果选择C ++ 11或更新的标准,则使用I recommend giving this a read.互斥设施来提高您的可移植性。