0

我的问题与此线程类似,但是我确定在给定线程中得出的结论是否适用于此。

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

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

我目前的实现如下

  1. 状态线程 Main() Take ReadLock 读取应用组名 Release the ReadLock

    发送状态

  2. Updater Thread Main() 获取写锁 更新组名 释放 WriteLock

但是,由于要发送大量更新,我担心我可能会因重负载而导致性能下降。所以我正在努力执行以下操作,但我不确定这是否可行。

新提议的实施是

  1. 发送者线程持有 char* ptr、char[1024] primaryData、char[1024] secondaryData。
  2. 首次启动应用程序时,组名在 primaryData 中更新,并且 ptr 指向 primaryData。
  3. 每当更新线程有更新事件时,它会检查是否 (ptr == primaryData) 将新应用程序名称复制到辅助数据 ptr = secondaryData else 将新应用程序名称复制到primaryData。ptr = 主数据
  4. 状态线程将始终使用 ptr 指向的数据来发送状态。状态线程最终将接收更新的 ptr(考虑缓存一致性)并将开始传输新数据。

这里有几点需要考虑。1.即使状态线程不能立即获得新数据也没关系 2.我不希望由于无效的内存访问而导致程序崩溃。

朋友们,你能告诉我上面的逻辑是否能帮助我避免读写锁。

4

2 回答 2

1

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

于 2012-05-28T17:31:14.307 回答
1

您能否告诉我上述逻辑是否可以帮助我避免读写锁定。

不,这个逻辑不会让你避免锁定。提议的方案充满了竞争条件。

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

如果 - 并且仅当 - 事实证明这会导致不可接受的锁争用,您应该考虑进一步优化。

于 2012-05-28T16:20:52.103 回答