关于 concurrent_queue::unsafe_size()
有多不安全,文档不是很清楚。
tbb/internal/concurrent_queue.h
文件中的 doxygen 注释提到:
Get size of queue; result may be invalid if queue is modified concurrently
我想知道的是它会在过去的某个时候返回有效大小,还是会返回垃圾? (前提是有几个线程都在读写)。
我对确切的值不感兴趣,但对“负载”指示更感兴趣。当消费者线程出现问题时,我想防止我的队列容量激增。我会使用 concurrent_bounded_queue
,顾名思义它具有容量控制,但我会失去无锁属性。
最佳答案
您确实应该将其视为垃圾,因为它被标记为不安全。我认为它实际上可能会返回有问题的数字,因为如果内存起作用,它确实是推送和弹出之间的区别。然而,即使它是“安全的”,它仍然只会返回过去有效的数字,这是无等待编程的乐趣之一。 如果您真的需要对计数进行推理,请在保存队列的类中存储一个原子计数。
您是否有理由不使用 tbb 中的任务原语之一,而是构建自己的任务原语?
关于c++ - TBB concurrent_queue,unsafe_size有多不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9903933/