WaitForMultipleObjects与CRITICAL_SECTION

时间:2011-09-09 08:35:39

标签: multithreading winapi synchronization

我的理解是WaitForMultipleObjectsCRITICAL_SECTION都是等待线程完成的。并且它们都被描述为线程之间的进程和线程同步机制。如果它们旨在实现相同的目标,它们可以互换使用吗?如果没有,那么它们之间有什么区别?

3 个答案:

答案 0 :(得分:3)

它们不可互换,用途不同。

关键部分是互斥锁。包含在关键字中的代码块可以一次由一个线程输入。这也称为序列化,因为受保护的块是串行执行的。

WaitForMultipleObjects函数及其各种亲属用于阻塞,直到发出同步对象信号。这可能是一个事件变为信号,一个线程完成,一个过程完成,一个互斥体变得可用等等。

通常使用等待函数来确保正确处理依赖关系。例如,如果计算只能在其他计算完成时继续进行,则将使用等待函数来阻止,直到其他计算完成为止。使用正确的等待函数而不是繁忙的旋转外观可以避免浪费时钟周期。

答案 1 :(得分:0)

我认为来自MSDN的引用就足够了:

  

关键部分对象提供类似的同步   由互斥对象提供,但可以使用临界区   仅由单个进程的线程组成。事件,互斥和信号量   对象也可以在单进程应用程序中使用,但很关键   section对象提供了一种更快,更有效的机制   用于互斥同步(特定于处理器的测试和   设定指示)。

所以Critical Sections用于单进程同步。使用WaitForMultipleObjects,您可以处理多个进程。

我将使用WaitForMultipleObjects添加它,您可以等待其他事情,例如异步I / O函数,计时器......

答案 2 :(得分:0)

Critical Section是用户对象(注意核心),因此它比任何mutex更快(它是核心对象,因此需要系统核心调用)。因此,CS可用于仅同步一个进程内的线程(您不能在不同进程中使用一个CS)。 WaitForMultipleObjects使用核心对象进行同步(互斥,事件),因此它实际上可用于进程间同步。 要以同样的方式使用CS,您还需要conditional variable(不在Win XP中,仅在稍后)。