我的问题与此线程类似,但是我确定给定线程中得出的结论是否适用于此处。
我的用例:在应用程序中,有一个状态线程,每 1 秒发送一次相同的文本信息。属性信息包含应用程序组名称。状态读取器使用此状态来确定应用程序服务器是否打开/关闭。
现在,应用程序组名称可以在其生存期内更改。确保应用程序中只有单个线程由于某些用户活动而触发此事件。现在,这个线程具有新的应用程序组名称,我需要将其更新为我的状态线程。
我目前的实现如下
-
状态线程主()读取锁定读取应用程序组名称释放读锁
发送状态
-
更新程序线程主()已采取的写锁定更新组名称释放写锁定
但是,由于要发送大量更新,我担心可能会在重负载下引入性能下降。所以我正在努力实现,但我不确定这是否有效。
新提议的实施是
- 发送方线程保存 char* ptr, char[1024] primaryData, char[1024] secondaryData。
- 首次启动应用程序时,组名称在 primaryData 中更新,ptr 指向 primaryData。
- 每当更新线程具有更新事件时,它都会检查是否(ptr == 主要数据) 将新应用程序名称复制到辅助数据 PTR = 辅助数据还 将新应用程序名称复制到主数据。 PTR = 主数据
- 状态线程将始终使用 ptr 指向的数据来发送状态。状态线程最终将接收更新的 PTR(考虑缓存一致性),并将开始传输新数据。
这里要考虑的几点。1.即使新数据不能立即可用于状态线程也没关系2.我不希望由于无效的内存访问而导致程序崩溃。
朋友们,您能否告诉我上述逻辑是否可以帮助我避免读写锁定。
您能否告诉我上述逻辑是否可以帮助我避免读写锁定。
不,此逻辑不会让您避免锁定。提出的方案充满了竞争条件。
我的建议是使用状态和更新线程共享的单个char
数组和单个互斥锁。这将导致非常简单的逻辑,很容易正确。
如果 - 并且仅当 - 事实证明这会导致不可接受的锁争用,您应该考虑进一步优化。
在具有单个读取器和单个写入器的方案中,读写锁与普通的旧互斥锁没有什么不同。只需使用互斥锁。