据我所知,WaitForMultipleObjects和CRITICAL_SECTION都是用来等待线程完成的。并且它们都被描述为线程之间的进程和线程同步机制。如果它们旨在实现相同的目标,它们是否可以互换使用?如果不是,那么它们之间的区别是什么?
发布于 2011-09-09 16:46:00
它们不可互换,并可用于不同的目的。
临界区是一个互斥锁。关键字中包装的代码块一次只能由一个线程输入。这也称为序列化,因为受保护的块是串行执行的。
WaitForMultipleObjects函数及其各种相关函数用于阻塞,直到同步对象被用信号通知为止。这可能是一个事件变得有信号,一个线程完成,一个进程完成,一个互斥变得可用,等等。
通常,等待函数用于确保正确处理依赖关系。例如,如果一个计算只能在其他计算完成时才能继续,则将使用等待函数来阻塞,直到这些其他计算完成为止。使用适当的等待函数,而不是繁忙的旋转查找,可以避免浪费时钟周期。
发布于 2011-09-09 16:44:13
我认为引用MSDN的一句话就足够了:
临界区对象提供与互斥对象类似的同步,不同之处在于临界区只能由单个进程的线程使用。事件、互斥和信号量对象也可以在单进程应用程序中使用,但临界区对象为互斥同步(特定于处理器的测试和设置指令)提供了一种稍微更快、更有效的机制。
所以Critical Sections是用于单进程同步的。使用WaitForMultipleObjects,你可以控制多个进程。
我将补充说,使用WaitForMultipleObjects,您可以等待其他事情,例如异步I/O函数、计时器……
发布于 2011-09-09 17:25:04
Critical Section是用户对象(注意核心),所以它比任何mutex都快(它是核心对象,所以需要系统核心调用)。因此,CS只能用于同步一个进程中的线程(不能在不同的进程中使用一个CS )。WaitForMultipleObjects使用核心对象进行同步(互斥、事件),因此它实际上可以用于进程间同步。要以同样的方式使用CS,您还需要一个conditional variable (不是在Win XP中,只是以后才需要)。
https://stackoverflow.com/questions/7359068
复制相似问题