【发布时间】:2021-07-16 14:14:28
【问题描述】:
来源有以下评论:
// Return the number of items in the queue; thread unsafe
std::ptrdiff_t size() const {
return my_queue_representation->size();
}
但后来我查看了内部 impl,这一切似乎都是线程安全的(操作是 std::atomic 的负载,然后是一些减法)。
std::ptrdiff_t size() const {
__TBB_ASSERT(sizeof(std::ptrdiff_t) <= sizeof(size_type), NULL);
std::ptrdiff_t hc = head_counter.load(std::memory_order_acquire);
std::ptrdiff_t tc = tail_counter.load(std::memory_order_relaxed);
std::ptrdiff_t nie = n_invalid_entries.load(std::memory_order_relaxed);
return tc - hc - nie;
}
评论是错误的,还是我遗漏了什么?
【问题讨论】:
-
我看不出它是如何实现线程安全的。加载了 3 个单独的原子,并且值可以在两者之间变化。迟早你会得到一个负尺寸返回。
标签: c++ multithreading thread-safety tbb