C++ boost planner_cond_.wait(lock) 报错1225

1.如下程序段 boost unique_lock doesn’t own the mutex: Operation not permitted
问题:
其中makePlan是一个线程。这里的unlock导致错误这个报错 boost unique_lock doesn’t own the mutex: Operation not permitted

 bool navigation::makePlan(){  
      //cv::namedWindow("Dynamic Image", cv::WINDOW_AUTOSIZE); // 创建一个窗口
      global_cost_map_ = planner_costmap_ros_->getCostmap();
      costs_           = global_cost_map_->getCharMap(); 
      unsigned int cx  = global_cost_map_->getSizeInCellsX(), cy = global_cost_map_->getSizeInCellsY();//xwidth y height
      //int x[9]  = {748,1332,713,539,535,1424,1577,712,1007}; // x width  cx
      //int y[9]  = {cy-343,cy-312,cy-333,cy - 288,cy - 287,cy - 61,cy - 282,cy - 266,cy - 771};//y height cy
      int x[2] = {363,424};
      int y[2] = {cy - 694,cy - 1061};
      //int k =8;// 6;
      int k = 0;
      boost::unique_lock<boost::recursive_mutex> lock(planner_mutex_);
      while(1)
      { 
       // while(!runner_){
        //std::cout << "plan thread enter waiting status!" << std::endl;
        planner_cond_.wait(lock);
        lock.unlock();
         //   runner_ = true; 
       // }
        //std::cout << "starting planning..." << std::endl;
        if(state_ == PLANNING)  
        {
            global_cost_map_ = planner_costmap_ros_->getCostmap();
            costs_           = global_cost_map_->getCharMap(); 
            unsigned int cx  = global_cost_map_->getSizeInCellsX(), cy = global_cost_map_->getSizeInCellsY();

            convert_offset_ = 0.5;
            //lock.unlock();
            bool gotPlan = false;//navigation::makePlanner(start,goal,plan_result_cell_);


             //std::cout << "Planning Complete!" << std::endl;
        }
      }

    }

分析:


```cpp
boost::unique_lock<boost::recursive_mutex> lock(planner_mutex_);

while (1) {
    planner_cond_.wait(lock); // 等待条件变量的通知并解锁互斥量

    // 在条件变量的通知下被唤醒后,获取到互斥量的所有权
    bool gotPlan = false;
    
    // 执行计划的操作
    // ...
    // 设置gotPlan为true或false表示是否成功获得计划

    lock.unlock(); // 在计划完成后解锁互斥量

    lock.lock(); // 重新上锁互斥量
}

在这个例子中,在while循环开始之前,我们创建了一个boost::unique_lock对象并传入互斥量。然后,我们在循环体内调用planner_cond_.wait(lock)等待条件变量的通知,并在等待之前释放锁。当收到条件变量的通知时,unique_lock对象会自动重新获取互斥量的所有权,然后我们继续执行计划的操作。

在计划完成后,我们首先调用unlock()解锁互斥量,然后重新使用lock()重新上锁互斥量,以便在下一次循环开始时可以正确地等待新的条件变量通知。

通过这种方式,我们保证了唤醒的线程可以获得互斥量的所有权,并避免在没有所有权的情况下解锁互斥量导致的错误。


```cpp
 bool navigation::makePlan(){  
      //cv::namedWindow("Dynamic Image", cv::WINDOW_AUTOSIZE); // 创建一个窗口
      global_cost_map_ = planner_costmap_ros_->getCostmap();
      costs_           = global_cost_map_->getCharMap(); 
      unsigned int cx  = global_cost_map_->getSizeInCellsX(), cy = global_cost_map_->getSizeInCellsY();//xwidth y height
      //int x[9]  = {748,1332,713,539,535,1424,1577,712,1007}; // x width  cx
      //int y[9]  = {cy-343,cy-312,cy-333,cy - 288,cy - 287,cy - 61,cy - 282,cy - 266,cy - 771};//y height cy
      int x[2] = {363,424};
      int y[2] = {cy - 694,cy - 1061};
      //int k =8;// 6;
      int k = 0;
      boost::unique_lock<boost::recursive_mutex> lock(planner_mutex_);
      while(1)
      { 
       // while(!runner_){
        //std::cout << "plan thread enter waiting status!" << std::endl;
        planner_cond_.wait(lock);
        lock.unlock();
         //   runner_ = true; 
       // }
        //std::cout << "starting planning..." << std::endl;
        if(state_ == PLANNING)  
        {
            global_cost_map_ = planner_costmap_ros_->getCostmap();
            costs_           = global_cost_map_->getCharMap(); 
            unsigned int cx  = global_cost_map_->getSizeInCellsX(), cy = global_cost_map_->getSizeInCellsY();

            convert_offset_ = 0.5;
            //lock.unlock();
            bool gotPlan = false;//navigation::makePlanner(start,goal,plan_result_cell_);


             //std::cout << "Planning Complete!" << std::endl;
        }
       lock.lock();//循环结束要上锁
      }

    }

2. 上述线程占用CPU资源较大,如何处理?

可能是因为程序中的循环没有适当的等待时间,导致CPU不断地执行循环代码。为了降低CPU占用率,您可以在循环中添加适当的等待时间。

具体在循环添加如下等待时间:

  std::this_thread::sleep_for(std::chrono::milliseconds(100));



3.	C++ 报错 coredown如何解决?
     Aborted (core dumped)

首先设置“

 ulimit -c unlimited   //将coredown文件设置不限制存储空间

重新执行问题程序,camke 编译后在build文件下
在这里插入图片描述
发生core dump之后,使用gdb查看core文件的内容, 以定位文件中引发core dump的行,在在Linux下,查看core文件中的出错堆栈信息有二种方式,使用:gdb -c core.pid program_name或gdb [program_name] [core.pid]可以进入gdb模式:
在进入gdb后输入where并回车,就可以指出是在哪一行被Down掉,在哪个函数内,由谁调用等等。
在进入gdb后输入 bt,用bt命令查看backtrace以检查发生程序运行到哪里,来定位core dump的文件->行。

那我们的文件下运行

gdb -c core navigation

然后再输入

where

Reference

1. Linux遇到Aborted (core dumped)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/269104.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中如何快速定位占用CPU过高的SQL

作为DBA工作中都会遇到过数据库服务器CPU飙升的场景&#xff0c;我们该如何快速定位问题&#xff1f;又该如何快速找到具体是哪个SQL引发的CPU异常呢&#xff1f;下面我们说两个方法。聊聊MySQL中如何快速定位占用CPU过高的SQL。 技术人人都可以磨炼&#xff0c;但处理问题的思…

JVM内存结构Java内存模型Java对象模型

悟空老师思维导图&#xff1a;https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9 1.JVM内存结构&&Java内存模型&&Java对象模型 1.1.JVM内存结构 1.2.Java对象模型 Java对象模型…

顺序表的实现

目录 一. 数据结构相关概念​ 二、线性表 三、顺序表概念及结构 3.1顺序表一般可以分为&#xff1a; 3.2 接口实现&#xff1a; 四、基本操作实现 4.1顺序表初始化 4.2检查空间&#xff0c;如果满了&#xff0c;进行增容​编辑 4.3顺序表打印 4.4顺序表销毁 4.5顺…

酷开系统千屏千面,深度探索消费者喜好

为什么大家这么喜欢用酷开系统呢&#xff1f;当然是因为它好用啊&#xff01;酷开系统基于人工智能技术&#xff0c;为消费者提供个性化的服务。它具有“千人千面”的推荐特性&#xff0c;即根据消费者的需求和喜好&#xff0c;自动生成个性化的内容推荐和界面布局。 01.更智能…

pngPackerGUI是一款免费的图集打包工具,png图片打包plist工具

pngPackerGUI是一款免费的图集打包工具&#xff0c;png图片打包plist工具 手把手教你使用pngPackerGUI_V2.0此软件是在pngpacker_V1.1软件基础之后&#xff0c;开发的界面化操作软件&#xff0c;方便不太懂命令行的小白快捷上手使用。1.下载并解压缩软件&#xff0c;得到如下目…

Python桌面开发技术 PyQt6教程专栏 一周快速上手,开发桌面应用

大家好&#xff0c;我是python222小锋老师。 近日锋哥又卷了一波课程&#xff0c;Python桌面开发技术 PyQt6教程&#xff0c;文字版视频版。一周掌握。 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(…

LeetCode刷题--- 字母大小写全排列

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回…

cesium实现二三维联动

记录项目中实现二三维地图联动 效果如下&#xff1a; 第一步&#xff1a;现在页面中加载二三维地图&#xff08;地图的初始化已省略&#xff09; <template><div><div><button click"show">二三维联动</button></div><div&…

css学习笔记7(浮动)

css学习笔记7&#xff08;浮动&#xff09; 六、浮动1.浮动的简介2.元素浮动后的特点3.浮动影响3.1浮动后会有哪些影响3.2浮动后会有哪些影响 4.浮动布局练习 六、浮动 1.浮动的简介 ​ 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面…

VR全景对普通人的生活有哪些好处?

许多普通人对VR全景还全然没有概念&#xff0c;这是因为VR全景虽然一直在快速发展&#xff0c;但目前为止也不过几年而已&#xff0c;但这发展的几年同样为我们普通人的生活带来了切实的改变和便利。VR全景技术为人们带来了沉浸感和真实感的体验&#xff0c;让我们感受到迥异于…

C# SqlSugar 数据库 T4模板

生成效果 模板代码 <# template debug"false" hostspecific"true" language"C#" #> <# output extension".cs" #> <# assembly name"System.Core" #> <# assembly name"System.Data" #>…

图片素材管理软件Eagle for mac提高素材整理维度

Eagle for mac是一款图片素材管理软件&#xff0c;支持藏网页图片&#xff0c;网页截屏&#xff0c;屏幕截图和标注&#xff0c;自动标签和筛选等功能&#xff0c;让你设计师方便存储需要的素材和查找&#xff0c;提供工作效率。 Eagle mac软件介绍 Eagle mac帮助你成为更好、…

小天使的小难题:新生儿疝气的关注与温馨呵护

引言&#xff1a; 新生儿疝气是一种在出生后可能出现的常见情况&#xff0c;虽然通常不会造成长期影响&#xff0c;但对于家长而言&#xff0c;了解如何正确应对新生儿疝气是至关重要的。本文将深入探讨新生儿疝气的原因、症状&#xff0c;以及家长在面对这一问题时应该采取的…

Isaac Sim urdf文件导入

本教程展示如何在 Omniverse Isaac Sim 中导入 urdf 一. 使用内置插件导入urdf 安装urdf 插件 方法是转到“window”->“Extensions” 搜索框中输入urdf, 并启用 通过转至Isaac Utils -> Workflows -> URDF Importer菜单来访问 urdf 扩展。 表格中的 1,2,3 对应着…

系列七(实战)、发送 接收单向消息(Java操作RocketMQ)

一、发送 & 接收单向消息 1.1、概述 发送单向消息&#xff0c;适用于发送方不关心或者不在意消息的发送结果&#xff0c;这种方式的吞吐量很大&#xff0c;但是存在消息丢失的风险&#xff0c;对于重要消息要慎用&#xff01;该种方式通常适用于对消息没有那么严格的场景中…

0基础学习VR全景平台篇第131篇:曝光三要素—光圈

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 我们经常从电视或书刊上看到这样的照片&#xff0c;照片的主体清晰&#xff0c;前后镜朦胧虚化&#xff0c;整体看起来非常的漂亮。那这样的照片是如何拍出来的呢&#xff1f;他和…

A+CLUB管理人支持计划第十期 | 坤望基金

免责声明 本文内容仅对合格投资者开放&#xff01; 私募基金的合格投资者是指具备相应风险识别能力和风险承担能力&#xff0c;投资于单只私募基金的金额不低于100 万元且符合下列相关标准的单位和个人&#xff1a; &#xff08;一&#xff09;净资产不低于1000 万元的单位&…

第十八节TypeScript 泛型

1、简介 泛型是一种编程语言特性&#xff0c;允许在定义函数、类、接口等使用占位符来表示类型&#xff0c;而不是具体的类型。 泛型是一种在编写可重用、灵活且类型安全的代码时非常有用的功能。 使用泛型的主要目的是为了处理不特定类型的数据&#xff0c;使得代码可以适用…

公众号推荐流量玩法的3个秘密

从微信生态的流量触点来看&#xff0c;公众号链接着私聊、朋友圈、微信群、小程序、视频号、搜一搜、看一看等一切与目标用户能接触到的中转站 流量的尽头是私域。而对于大部分普通人来说&#xff0c;公众号可以作为私域的第一站。且相比个人微信号&#xff0c;其有着深度价值…

【数字电路】期末速通!

1. 数制及转换 常用的数制&#xff1a;十进制&#xff08;D&#xff09;&#xff0c;二进制&#xff08;B&#xff09;&#xff0c;八进制&#xff08;O&#xff09;&#xff0c;十六进制&#xff08;H&#xff09;。 常见的码制包括以下几种&#xff1a; 二进制码&#xff…