我在许多线程(foo
)中运行了一个函数std::thread t([&]() { foo(a); }
:
void foo(int a)
{
if (x && y != a)
{
++x;
y = a;
vec.push_back(std::chrono::high_resolution_clock::now());
}
}
我需要保护int x
,int y
和std::vector<> vec
免受竞争条件的影响。
什么是最好的解决方案。
要将x
和y
定义为std::atomic
,并在推送到std::lock_guard(mutex)
之前使用vec
。
或std::lock_guard
if
声明的全部内容?
或者可能是更好的解决方案?
答案 0 :(得分:1)
如果没有更多的上下文,很难确定,但看起来您正在使用和修改y
,因此您可能需要在if
之前将其锁定,直到分配。使用std::atomic
无法做到这一点。鉴于您正在对该代码区域进行静音,您在制作x
原子时获得的好处(此处)很少。但你没有向我们展示任何阅读它,所以很难说。
答案 1 :(得分:0)
这在某种程度上取决于线程在其余时间使用的是什么,使用x和y,但作为一般经验法则,你做得越少越好。