【问题标题】:std::atomics and std::lock_guard or only std::lock_guardstd::atomics 和 std::lock_guard 或只有 std::lock_guard
【发布时间】:2016-10-11 14:40:29
【问题描述】:

我有一个函数 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 并在推送到vec 之前使用std::lock_guard(mutex)

或者std::lock_guard 代表整个if 语句?

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

【问题讨论】:

  • 我个人会锁定整个事情,因为整个操作似乎不应该交错。
  • 在您测试y != 5 之后,您是否介意另一个线程在您到达y = 5 行之前更改y

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


【解决方案1】:

没有更多上下文很难确定,但看起来您正在使用和修改y,因此您可能需要从if 之前锁定它直到分配之后。 std::atomic 无法做到这一点。鉴于您随后对该代码区域进行了互斥,因此(此处)使x 原子化几乎没有什么好处。但是你没有向我们展示任何从中读到的东西,所以很难说。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-18
      • 2022-11-22
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多