【发布时间】:2009-10-13 22:53:39
【问题描述】:
我有很多数据想要分发给许多不同的线程。此数据来自单个线程。消费线程可以同时安全地访问容器。
数据需要每隔 delta 秒(50ms
我正在使用 linux(平台特定的解决方案非常好/预期),我关心每一毫秒。我应该使用哪种锁定机制,或者是否有更好的模型来解决这个问题?
【问题讨论】:
-
你应该更清楚地指定事情。所有线程都获得相同的数据,还是先到先得?如果是后者,你想如何定义顺序?让调度器做它的事,还是你想要更多的控制权?最后,非阻塞是强制性的吗?如果是这样,你就有点被自旋锁和类似的结构所困。
-
在这里使用自旋锁可能是个坏主意。如果锁是高度竞争的(听起来确实如此),自旋锁会遭受严重的性能下降,通常执行比读/写锁差几个数量级。基本上,竞争线程会占用 CPU 旋转并用锁使线程饿死。使用带有退避机制的自旋锁有时可以帮助解决这个问题。
-
所有线程访问相同的数据,那里的优先级没有问题。读取线程响应某些事件而唤醒,需要立即响应。如果他们有最新的数据,他们会做出最好的决定,但是更新容器对象可能需要 10 毫秒,在此过程中,使用陈旧数据进行响应比等待更好。所以我想他们试图获得一个读锁,并在成功时更新他们的状态,在失败时仍然响应,只是使用陈旧的数据。唯一可以阻塞的线程是等待更新容器时的写入线程。
标签: c++ linux multithreading