当前位置: 首页 > 知识库问答 >
问题:

线程时程序返回:143

傅鸿波
2023-03-14

我有一个方法:

void move_robot(const vector<vector<double> > &map) {
    // accumulate the footprint while the robot moves
    // Iterate through the path
        //std::unique_lock<std::mutex> lck(mtx);
        for (unsigned int i=1; i < map.size(); i++) {

            while (distance(position , map[i]) > DISTANCE_TOLERANCE ) {
                this->direction = unitary_vector(map[i], this->position);
                this->next_step();
                lck.unlock();
                this_thread::sleep_for(chrono::milliseconds(10)); // sleep for 500 ms
                lck.lock();
            }
            std::cout << "New position is x:" << this->position[0] << " and y:" << this->position[1] << std::endl;
        }
        this->moving = false;
        // notify to end
    }

当包括睡眠和锁时,我得到:

ASM generation compiler returned: 0
Execution build compiler returned: 0
Program returned: 143

Killed - processing time exceeded 

不过,如果我注释所有锁和this_thread::sleep_for,它会按照预期工作。我需要锁,因为我正在处理其他线程。完整的代码如下所示:https://godbolt.org/z/7erjrg,因为otput提供的信息不多,所以我很累

共有1个答案

洪伟兆
2023-03-14

您还没有发布NEXT_STEP的代码和MTX的定义,这是重要的信息。

std::mutex mtx;

void next_step() {
  std::unique_lock<std::mutex> lck(mtx);
  this->position[0] += DT * this->direction[0];
  this->position[1] += DT * this->direction[1];
}

如果您阅读了std::mutex的手册,您会发现:

  • 调用线程在调用lock或try_lock之前不能拥有互斥体。

和std::unique_lock:

move_robot调用的next_step违反了这一点,它试图锁定调用线程已经拥有的互斥对象。

您的问题的相关主题是unique_lock是否可以与recursive_mutex一起使用?。这样你就得到了解决办法

std::recursive_mutex mtx;
std::unique_lock<std::recursive_mutex> lck(mtx);
 类似资料:
  • 当释放线程回到?是调用方法后还是关联任务完成后?

  • 问题内容: 我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级? 问题答案: 我建议您在启动线程之前实例化Queue.Queue,并将其作为线程的args之一传递:在线程完成之前,它将结果作为参数接收到的队列中。父母可以或愿意。 队列通常是在Python中安排线程同步和通信的最佳方法:队列本质上是线程安全的消息传递工具,这是组织多任务的最佳方法!

  • 问题内容: 我有一个方法。值在内部被更改,我想将其返回给该方法。有没有办法做到这一点? 问题答案: 可以使用局部最终变量数组。该变量必须是非基本类型,因此可以使用数组。你还需要同步两个线程,例如使用CountDownLatch: 你也可以这样使用an Executor和a Callable:

  • 问题内容: 我有一个如下的Java线程: 我大约有300个ID,每隔几秒钟-我启动线程以对每个ID进行呼叫。例如。 现在,我想从每个线程收集结果,并批量插入数据库,而不是每2秒进行300次数据库插入。 知道我该如何做到吗? 问题答案: 如果要在执行数据库更新之前收集所有结果,则可以使用该方法。如daveb建议的那样,如果您一次提交一项任务,则可以完成簿记工作。

  • 问题内容: 我的android类中有以下线程。我如何从线程中获取err的值??? 我希望该值是方法的返回值,但是对于我一生来说,我无法获得该值… 问题答案: 您可以通过两种方式实现这一目标。 在 糟糕的 方式。创建一个可变对象,如整数 列表 ,然后让Thread(可运行)写入列表。您可以在外部类/方法的列表中访问值。 使用而不是。一个可以返回值

  • 问题内容: 我是Java多线程的新手。我已经进行了一些研究,阅读了教程并进行了测试,但是我仍然遇到这个问题。基本上,我正在设置游戏的骨架,我想拥有一个主要的活动类,一个包含方法的线程类,执行各种慢速操作(读取文件并将内容解压缩到缓冲区),并具有一个线程是游戏循环对UI操作的反应。 首先,我有main活动类,该类实例化并启动一个单独的线程: 然后,我有了实现游戏逻辑线程的类: 最后,线程类(其中包含