1

这是场景。我有多个处理器线程读取一个值。只允许 1 个线程写入该值。由于设置,自然地,在写入过程中没有人可以读取。因此,当 1 个人写入新值时,CCriticalSection 将锁定所有工作线程。但是,如果我这样做,每次有人想要查看它时,所有工作线程都会停止(它们互相锁定)。它在处理过程中造成了瓶颈,因为所有工人都必须停下来排队才能读取值。除了 CCriticalSection 之外,还有什么方法可以让所有小工作者继续阅读(这很好,那里没有线程问题),但只有在主线程想要写入时才停止它们?

我考虑过设置一个布尔值,告诉工作人员停止,然后 Sleep() 大约一秒钟(让他们完成),进行更新,然后重置布尔值。这似乎..好吧..重手。

4

3 回答 3

0

您可以使用读取器/写入器锁,http ://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock 这将为您提供有效的保护

于 2012-05-30T17:34:26.147 回答
0

您描述的序列化在您当前的设计中是不可避免的。

“但是,如果我这样做,每次有人想要查看它时,所有工作线程都会停止(它们相互锁定)。它会产生瓶颈。”

重新设计代码,以便其他线程在等待写入完成时被程序用来完成与您的算法相关的子任务。

该方法被称为工作窃取,并在其他有关排序队列的stackoverflow 帖子中进行了讨论。

于 2012-05-30T17:34:57.890 回答
0

您也可以使用InterlockedXXXXX 功能- 完全避免锁定 - 参见例如这篇文章

于 2012-05-30T17:52:54.870 回答