Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading WaitForMultipleObjects vs CRITICAL_部分_Multithreading_Winapi_Synchronization - Fatal编程技术网

Multithreading WaitForMultipleObjects vs CRITICAL_部分

Multithreading WaitForMultipleObjects vs CRITICAL_部分,multithreading,winapi,synchronization,Multithreading,Winapi,Synchronization,我的理解是,WaitForMultipleObjects和CRITICAL_SECTION都意味着等待线程完成。它们都被描述为线程之间的进程和线程同步机制。如果它们是为了达到相同的目标,它们可以互换使用吗?如果没有,那么它们之间的区别是什么?我认为引用以下内容就足够了: critical section对象提供了与此类似的同步 由互斥对象提供,但可以使用关键部分 仅由单个进程的线程执行。事件、互斥和信号量 对象也可以在单个流程应用程序中使用,但非常重要 截面对象提供了一种稍微更快、更高效的机制

我的理解是,
WaitForMultipleObjects
CRITICAL_SECTION
都意味着等待线程完成。它们都被描述为线程之间的进程和线程同步机制。如果它们是为了达到相同的目标,它们可以互换使用吗?如果没有,那么它们之间的区别是什么?

我认为引用以下内容就足够了:

critical section对象提供了与此类似的同步 由互斥对象提供,但可以使用关键部分 仅由单个进程的线程执行。事件、互斥和信号量 对象也可以在单个流程应用程序中使用,但非常重要 截面对象提供了一种稍微更快、更高效的机制 用于互斥同步(特定于处理器的测试和 设置指令)

因此,
关键部分
用于单进程同步。使用
WaitForMultipleObjects
可以对多个进程进行sinc


我要补充的是,使用
WaitForMultipleObjects
您可以等待其他东西,例如异步I/O函数、计时器……

它们不可互换,用于不同的目的

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

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


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

关键部分是用户对象(注意核心),因此它比任何
互斥对象都快(它是核心对象,因此需要系统核心调用)。因此,
CS
只能用于同步一个进程内的线程(不能在不同的进程中使用一个
CS
)。
WaitForMultipleObjects
使用core对象进行同步(互斥体、事件),因此它实际上可以用于进程间同步。
要以相同的方式使用
CS
,还需要一个
条件变量(不在Win XP中,仅在以后)