平行送丝器螺纹是否安全
Is parallel_do_feeder thread safe?
以下代码存在并发问题。这里inDegVec
是全局int *
,getGUID()
和getTime()
是POD变量的无害访问器。
void operator () ( GNode& src,
tbb::parallel_do_feeder<GNode>& feed_it )
const
{
std::list<GNode> addNodes;
// some thread-safe code that populates addNodes
while (!addNodes.empty()) {
feed_it.add(addNodes.front());
addNodes.pop_front();
}
if (inDegVec[srcAVI->getUID()] == 0) {
// srcAVI is still the minimum among its neighbors
if (srcAVI->getTime() < colTime) {
//lwl.push (src);
//tbb::mutex::scoped_lock lock(histMutex);
assert(addNodes.empty());
feed_it.add(src);
}
}
};
如果我将while
/if
块封装在互斥对象中,那么代码就可以工作了。但为什么这是必要的呢?parallel_do_feeder::add()
不是线程安全的吗?我看到的示例代码(例如http://llpanorama.wordpress.com/2008/03/09/parallel_do-parallel-done/)不使用同步,这表明它是……而且我在TBB手册中没有看到关于parallel_do_filter线程安全的讨论。
parallel_do_feeder
是线程安全的。
GNode
线程的复制构造函数安全吗?传递给parallel_do_feeder::add()
的GNode
的实例被复制到将处理它的任务中(可能在另一个线程中)。
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?
- 使用自己的迭代器分配容器是否安全?