我的理解是WaitForMultipleObjects
和CRITICAL_SECTION
都是等待线程完成的。并且它们都被描述为线程之间的进程和线程同步机制。如果它们旨在实现相同的目标,它们可以互换使用吗?如果没有,那么它们之间有什么区别?
答案 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中,仅在稍后)。