c++ - 等待条件变量后线程未并行运行

标签 c++ multithreading c++11 parallel-processing condition-variable

请参阅下面从 cppreference 获取的 condition_variable 示例。在此示例中,一堆线程正在等待变量 i 变为 i == 1。我举了这个例子,只是在 worker 中添加了一个 std::this_thread::sleep_for(std::chrono::seconds(1)); 指令来检查它们是否实际上是并行运行的。令我惊讶的是他们没有,所以一定有一些我不理解的地方。所有的线程不是应该在收到通知后同时启动吗?

如果我删除与 condition_variable 相关的所有指令,那么线程会按预期并行运行,因此我相信我的编译器(带有 C++11 库的 LLVM)编译正确。

#include <iostream>
#include <condition_variable>
#include <thread>
#include <chrono>

std::condition_variable cv;
std::mutex cv_m; 
int i = 0;

void waits()
{
  std::unique_lock<std::mutex> lk(cv_m);
  std::cerr << "Waiting... \n";
  cv.wait(lk, []{return i == 1;});
  std::cerr << "...finished waiting. i == 1\n";
  std::this_thread::sleep_for(std::chrono::seconds(1));
  std::cerr << "...finished running.\n";
}

void signals()
{
  std::this_thread::sleep_for(std::chrono::seconds(1));
  {
    std::lock_guard<std::mutex> lk(cv_m);
    std::cerr << "Notifying...\n";
  }
  cv.notify_all();

  std::this_thread::sleep_for(std::chrono::seconds(1));

  {
    std::lock_guard<std::mutex> lk(cv_m);
    i = 1;
    std::cerr << "Notifying again...\n";
  }
  cv.notify_all();
}

int main()
{
  std::thread t1(waits), t2(waits), t3(waits), t4(signals);
  t1.join();
  t2.join();
  t3.join();
  t4.join();
}

最佳答案

看起来它们是并行运行的,但是只有其中一个能够在收到通知后锁定 cv_m 互斥量,其余的将继续等待。

关于c++ - 等待条件变量后线程未并行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43468865/

相关文章:

c++ - 如何写一个模板类来存放不同的模板类

c# - 在另一个线程中使用线程时发生内存泄漏

c++ - 在数组索引中将变量递增 N

c++ - 有效输入迭代器的默认构造

c++ - 如何按浮点值对对象 std::vector 进行排序

c++ - 当我们已经有了 char[] 时,c++ 中的字符串有什么必要性?

c++ - 如何为 C++ 元组编写折叠/求和函数?

c# - Random.Next() 有时会在不同的线程中返回相同的数字

c++ - 奇怪的循环缓冲区行为

c++ - 将 vector 分配给单个元素