使用`std::condition_variable`退出程序时出错

问题描述 投票:0回答:1

我遇到了一些与以下代码具有相同逻辑的代码的问题:

#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>

int main() {
  std::condition_variable myCV;
  std::mutex myMutex;
  std::unique_lock myLock(myMutex);
  bool isRunning{ true };

  std::jthread myThread([&isRunning, &myCV, &myLock]() {
    while (isRunning) {
      myCV.wait(myLock);
      // do some work here
    }
    std::cout << "Exited from myThread while loop." << std::endl;
    });

  for (int i = 0; i < 100; i++) {
    myCV.notify_one();
    std::this_thread::sleep_for(std::chrono::milliseconds(20));
    std::cout << "Test loop " << i << std::endl;
  }

  isRunning = false;
  myCV.notify_one();

  return 0;
}

基本上,我有一个循环来做一些工作,当我的工作在每次迭代中完成时,我调用另一个线程中的一个方法来处理数据而不阻塞主线程;为了避免每次创建和销毁线程,我在该线程内使用带有

std::condition_variable
的循环,以便在数据准备好时开始管理数据。

逻辑运行良好,但退出程序时出现问题;如果我运行代码,程序结束时会出现错误,因为互斥体析构函数调用

abort()
:

...\stl\src\mutex.cpp(164): unlock of unowned mutex

如果我评论下一行

myCV.notify_one();
,程序将继续运行而不停止。

如何优雅地退出程序而不出现任何错误?我做错了什么?

c++ multithreading visual-studio condition-variable
1个回答
0
投票

感谢您的评论。事实上,问题在于互斥锁在与获取互斥锁的线程不同的线程中解锁。将锁定义移到线程代码内解决了问题:

#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>

int main() {
  std::condition_variable myCV;
  std::mutex myMutex;
  bool isRunning{ true };

  std::jthread myThread([&isRunning, &myCV, &myMutex]() {
    std::unique_lock myLock(myMutex);
    while (isRunning) {
      myCV.wait(myLock);
      // do some work here
    }
    std::cout << "Exited from myThread while loop." << std::endl;
    });

  for (int i = 0; i < 100; i++) {
    myCV.notify_one();
    std::this_thread::sleep_for(std::chrono::milliseconds(20));
    std::cout << "Test loop " << i << std::endl;
  }

  isRunning = false;
  myCV.notify_one();

  return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.