std :: atomics和std :: lock_guard或仅限std :: lock_guard

时间:2016-10-11 14:40:29

标签: c++ multithreading c++11 stl

我在许多线程(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 xint ystd::vector<> vec免受竞争条件的影响。 什么是最好的解决方案。

要将xy定义为std::atomic,并在推送到std::lock_guard(mutex)之前使用vec

std::lock_guard if声明的全部内容?

或者可能是更好的解决方案?

2 个答案:

答案 0 :(得分:1)

如果没有更多的上下文,很难确定,但看起来您正在使用和修改y,因此您可能需要在if之前将其锁定,直到分配。使用std::atomic无法做到这一点。鉴于您正在对该代码区域进行静音,您在制作x原子时获得的好处(此处)很少。但你没有向我们展示任何阅读它,所以很难说。

答案 1 :(得分:0)

这在某种程度上取决于线程在其余时间使用的是什么,使用x和y,但作为一般经验法则,你做得越少越好。