这个用例需要读写锁

时间:2012-05-28 16:16:09

标签: c++ multithreading readwritelock

我的问题类似于this thread,但我确信在给定帖子中得出的结论是否适用于此。

我的用例: 在应用程序中,有一个状态线程,每1秒后发送相同的文本信息。文本信息包含应用程序组名称。状态读取器使用此状态来确定应用程序服务器是否打开/关闭。

现在应用程序组名称可以在其生命周期内更改。确保应用程序中只有单个线程由于某些用户活动而触发此事件。现在这个单线程有一个新的应用程序组名称,我需要更新到我的状态线程。

我目前的实施如下

  1. 状态主要线程() 读取ReadLock 阅读应用程序组名称 释放ReadLock

    发送状态

  2. 更新程序主线() 写锁定 更新组名称 释放WriteLock

  3. 然而,由于要发送大量更新,我担心我可能会为重负载引入性能降级。所以我正在努力实现以下功能,但我不确定这是否有用。

    新提议的实施是

    1. 发件人线程包含char * ptr,char [1024] primaryData,char [1024] secondaryData。
    2. 首次启动应用程序时,组名称在primaryData中更新,ptr指向primaryData。
    3. 每当更新线程有更新事件时,它都会 检查是否(ptr == primaryData)     将新应用程序名称复制到secondaryData         ptr = secondaryData 其他     将新应用程序名称复制到primaryData。     ptr = primaryData
    4. 状态线程将始终使用ptr指向的数据来发送状态。状态线程最终将收到更新的ptr(考虑缓存一致性)并将开始传输新数据。
    5. 这里有几点需要考虑。 即使状态线程无法立即获得新数据也没关系 2.由于无效的内存访问,我不希望程序崩溃。

      朋友们,请你告诉我上述逻辑是否有助于我避免读写锁定。

2 个答案:

答案 0 :(得分:1)

  你可以告诉我,如果上面的逻辑可以帮助我避免读写锁定。

不,这个逻辑不会让你避免锁定。拟议的计划充满了竞争条件。

我的建议是使用单个char数组和状态和更新线程共享的单个互斥锁。这将导致非常简单的逻辑很容易实现。

如果 - 并且仅当 - 结果导致不可接受的锁争用,则应考虑进一步优化。

答案 1 :(得分:1)

具有单个阅读器和单个编写器的场景中的读写锁与普通的旧互斥锁没有什么不同。只需使用互斥锁。