我正在尝试识别或理解适用于我遇到的特定并发编程问题的技术、惯用语。
为简单起见,假设我有一个实时图形用户界面 (UI),它始终以 10Hz 的频率在屏幕上重绘。
每当一组不同线程的至少一个实例正在运行时,我想在此 UI 上显示一个“忙碌”指示器,并且我希望该指示器在这些线程中正好有 0 个正在运行时停止显示。只要 UI 启动,这些线程就可以随时启动和停止。
我目前正在 golang 中实现这个(下面有相关的片段)。但总的来说,我按如下方式解决这个问题:
通过 mutex 保护对计数器 int waitCount
(请求我们指示“繁忙”的线程数)的R+W 访问waitLock
。
功能drawStatus()
:重绘整个 UI(每 100 毫秒发生一次):
绘制“忙碌”指示器
获取互斥体waitLock
如果整数waitCount
> 0:
释放互斥体waitLock
功能startWait()
:当一个线程需要指示忙碌时:
获取互斥体waitLock
增量整数waitCount
释放互斥体waitLock
功能stopWait()
:当一个线程不再需要指示繁忙时:
获取互斥体waitLock
递减整数waitCount
释放互斥体waitLock
对我来说,感觉我没有充分利用 golang 的并发功能并诉诸于我熟悉的互斥体。但即便如此,此代码中仍存在一个错误,其中“忙碌”指示器会过早消失。
老实说,我不是在寻找任何人来帮助识别该错误,而是试图传达我感兴趣的特定逻辑。是否有更惯用的 golang 方法来解决这个问题?或者是否有我应该研究的更通用的编程模式?我正在使用的这项技术有任何特定的名称吗?关于正确执行此操作的建议或指示会很棒。谢谢。
qq_遁去的一_1
慕容708150
相关分类