Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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
C 具有用于两个共享队列同步的多个关键部分_C_Windows_Multithreading_Winapi_Synchronization - Fatal编程技术网

C 具有用于两个共享队列同步的多个关键部分

C 具有用于两个共享队列同步的多个关键部分,c,windows,multithreading,winapi,synchronization,C,Windows,Multithreading,Winapi,Synchronization,我有两个40线程向共享队列a写入,一个线程从共享队列a读取 我已经使用 肠危重科(&cs) //做点什么 离开关键部门(&cs) 现在有另一个共享队列B,40个线程将写入共享队列B,另一个分离的线程将从该共享队列B读取。 现在,为了共享这个共享队列B并在线程之间同步它,我是否需要一个单独的关键部分(比如csB)?或者只有一个临界区cs可以达到此目的?您不必使用单独的临界区,但使用单独的临界区将允许更多的并行性。如果不同队列之间的读写高度同步,您可以将队列B上的所有操作放在队列A使用的相同关键部分

我有两个40线程向共享队列a写入,一个线程从共享队列a读取

我已经使用

肠危重科(&cs)

//做点什么

离开关键部门(&cs)

现在有另一个共享队列B,40个线程将写入共享队列B,另一个分离的线程将从该共享队列B读取。 现在,为了共享这个共享队列B并在线程之间同步它,我是否需要一个单独的关键部分(比如csB)?或者只有一个临界区cs可以达到此目的?

您不必使用单独的临界区,但使用单独的临界区将允许更多的并行性。如果不同队列之间的读写高度同步,您可以将队列B上的所有操作放在队列A使用的相同关键部分中,在这种情况下,可以重用关键部分。但是,请注意,这种重用也可能导致死锁情况

请注意,“关键部分”实际上是线程中的一系列代码。不同的关键部分可以共享的是这些代码范围的保护(通常是一个信号量)。因此,操纵某些队列的所有代码范围都由同一个防护装置防护,以确保队列上的更新不会相互干扰,因为这可能会导致队列损坏。

您不必使用单独的临界段,但使用单独的临界段将允许更多的并行性。如果不同队列之间的读写高度同步,您可以将队列B上的所有操作放在队列A使用的相同关键部分中,在这种情况下,可以重用关键部分。但是,请注意,这种重用也可能导致死锁情况


请注意,“关键部分”实际上是线程中的一系列代码。不同的关键部分可以共享的是这些代码范围的保护(通常是一个信号量)。因此,操纵某些队列的所有代码范围都由同一个防护装置防护,以确保队列上的更新不会相互干扰,因为这可能会导致队列损坏。

非常感谢,但您不认为使用相同的关键部分会增加延迟吗?例如,如果共享队列a可以自由写入,但共享队列B使用cs,则cs将不会提供给共享队列a,并且即使共享队列a已退出cs,也必须等待共享队列B离开cs与共享队列B无关,但它仍将等待它释放cs。@AyeshaHassan这正是为不同队列重用防护可能降低并行性的原因。所以我的建议是对不同的队列使用不同的警卫。警卫只是为了保护队列的完整性。非常感谢,但您不认为使用相同的关键部分会增加延迟吗?例如,如果共享队列a可以自由写入,但共享队列B使用cs,则cs将不会提供给共享队列a,并且即使共享,也必须等待共享队列B离开csQueueA与共享队列B无关,但它仍将等待它释放cs。@AyeshaHassan这正是为不同的队列重用防护可能降低并行性的原因。所以我的建议是对不同的队列使用不同的警卫。警卫只是为了保护队列的完整性。