std::thread “terminate called without an active exception”

在运行下面的代码后,就会报错:
terminate called without an active exception

#include <iostream>
  #include <thread>
  using namespace std;

  class background_task {
  public:
      void operator() () const {
         cout << "hello" << endl;
      } 
  };    

  void say() {

  }     

  int main() {
      background_task task;
      thread t(task);
      //t.join();                                                                                                                                                                                                                        

      return 0;
  }     

原因是主线程在任务线程还没有执行完成就退出了,销毁了一些资源,导致任务线程就异常了。要修复这个问题也很简单,就是调用join,等待子线程执行完成,代码如下:

#include <iostream>
  #include <thread>
  using namespace std;

  class background_task {
  public:
      void operator() () const {
         cout << "hello" << endl;
      } 
  };    

  void say() {

  }     

  int main() {
      background_task task;
      thread t(task);
      t.join();                                                                                                                                                                                                                        

      return 0;
  }     
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
void URcontrolcenter::start() { // 创建六个线程 for (int i = 0; i < 6; ++i) { threads.push_back(std::thread(&URcontrolcenter::processTasks, this));//六个线程同时运行 } // 将任务分配到队列中 for (int i = 0; i < relationship_list.size(); ++i) { taskQueue.push(i); } // 等待所有任务完成 std::unique_lockstd::mutex lock(mutex); conditionVariable.wait(lock, //阻塞当前线程 this{ return tasksCompleted == relationship_list.size(); });//表示所有任务已经完成,线程可以继续执行。 } void URcontrolcenter::processTasks() { //下面先报完成,然后下一轮上面给弹出 RewriteRelationShip relationship; int taskNumber; while (true) { // 获取下一个任务 { std::lock_guardstd::mutex lock(mutex);//使用线程锁确保线程安全 if (taskQueue.empty()) { //检查当前任务是否已经全部完成,如果已经完成,则退出循环,否则获取下一个任务,并处理该任务。 return; } taskNumber = taskQueue.front(); taskQueue.pop(); } // 处理任务 relationship.parseData(relationship_list[taskNumber],worningcrosstype); // 在任务完成后,增加了已完成任务的数量,并检查是否所有任务都已经完成。如果所有任务都已经完成,则调用conditionVariable.notify_one()函数,通知等待线程可以继续执行。 { std::lock_guardstd::mutex lock(mutex);//使用了std::lock_guard对象锁定了互斥锁mutex,以确保线程安全。 ++tasksCompleted; if (tasksCompleted == relationship_list.size()) { // 所有任务已完成,通知等待线程 conditionVariable.notify_one(); } } } } 这段代码程序异常结束,报错terminate called without an active exception 分析原因,给出修改
05-30
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值