没有CCriticalSection或CMutex的锁定处理

时间:2012-05-30 17:24:46

标签: c++ multithreading visual-c++ mfc

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

我考虑过设置一个布尔值来告诉worker停止,然后Sleep()一秒钟左右(让它们完成),执行更新,然后重置布尔值。这看起来......好吧......很重要。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  

“但是,如果我这样做,所有工作线程每次都会停止   想看看它们(它们相互锁定)。它创造了一个   瓶颈。“

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

该方法的名称为work stealing,并在other stackoverflow posts上讨论与排队队列有关。

答案 2 :(得分:0)

您还可以使用InterlockedXXXXX functions - 完全避免锁定 - 例如参见this文章