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 cyint 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()重新上鎖互斥量,以便在下一次循環開始時可以正確地等待新的條件變量通知。

通過這種方式,我們保證了喚醒的線程可以獲得互斥量的所有權,并避免在沒有所有權的情況下解鎖互斥量導致的錯誤。


```cppbool 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 cyint 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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536808.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536808.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536808.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

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

作為DBA工作中都會遇到過數據庫服務器CPU飆升的場景&#xff0c;我們該如何快速定位問題&#xff1f;又該如何快速找到具體是哪個SQL引發的CPU異常呢&#xff1f;下面我們說兩個方法。聊聊MySQL中如何快速定位占用CPU過高的SQL。 技術人人都可以磨煉&#xff0c;但處理問題的思…

華為OD機試 - 多段線數據壓縮(Java JS Python C)

在線OJ刷題 題目詳情 - 多段線數據壓縮 - Hydro 題目描述 下圖中,每個方塊代表一個像素,每個像素用其行號和列號表示。 為簡化處理,多線段的走向只能是水平、豎直、斜向45度。 上圖中的多線段可以用下面的坐標串表示:(2,8),(3,7),(3,6),(3,5),(4,4),(5,3),(6,2),(7,3),(…

042、序列模型

之——從時序中獲取信息 目錄 之——從時序中獲取信息 雜談 正文 1.建模 2.方案A-馬爾科夫假設 3.方案B-潛變量模型 4.簡單實現 雜談 很多連續的數據都是有前后的時間相關性的&#xff0c;并不是每一個單獨的數據是隨機出現的。在時序中會蘊含一些空間結構的變化信息、…

【數據科學】一文徹底理清數據、數據類型、數據結構的概念

一、什么是數據&#xff1f; 入門數據學科&#xff0c;首先第一步要認識數據什么&#xff0c;可能大多數人都無法對數據做一個準確的定義&#xff0c;在我們印象中&#xff0c;提到數據首先頭腦浮現的是數據表格&#xff0c;是一堆堆數字&#xff0c;那么數據就是數字嗎&#x…

SpringBoot 2.0 中默認 HikariCP 數據庫連接池原理解析

作為后臺服務開發&#xff0c;在日常工作中我們天天都在跟數據庫打交道&#xff0c;一直在進行各種CRUD操作&#xff0c;都會使用到數據庫連接池。按照發展歷程&#xff0c;業界知名的數據庫連接池有以下幾種&#xff1a;c3p0、DBCP、Tomcat JDBC Connection Pool、Druid 等&am…

阿里云服務器記錄

阿里云服務器記錄 CentOS 8.4 64位 SCC版 CentOS 7.9 64位 SCC版 CentOS 7.9 64位 CentOS 7.9 64位 UEFI版 Alibaba Cloud Linux Anolis OS CentOS Windows Server Ubuntu Debian Fedora OpenSUSE Rocky Linux CentOS Stream AlmaLinux 阿里云服務器有個scc版&#xff0c;這個…

Flask+Mysql項目docker-compose部署(Pythondocker-compose詳細步驟)

一、前言 環境&#xff1a; Linux、docker、docker-compose、python(Flask)、Mysql 簡介&#xff1a; 簡單使用Flask框架寫的查詢Mysql數據接口&#xff0c;使用docker部署&#xff0c;shell腳本啟動 優勢&#xff1a; 采用docker方式部署更加便于維護&#xff0c;更加簡單快…

如何在Go中使用模板

引言 您是否需要以格式良好的輸出、文本報告或HTML頁面呈現一些數據?你可以使用Go模板來做到這一點。任何Go程序都可以使用text/template或html/template包(兩者都包含在Go標準庫中)來整齊地顯示數據。 這兩個包都允許你編寫文本模板并將數據傳遞給它們,以按你喜歡的格式呈…

“C語言“——scanf()、getchar() 、putchar()、之間的關系

scanf函數說明 scanf函數是對來自于標準輸入流的輸入數據作格式轉換&#xff0c;并將轉換結果保存至format后面的實參所指向的對象。 而const char*format 指向的字符串為格式控制字符串&#xff0c;它指定了可輸入的字符串以及賦值時轉換方法。 簡單來說給一個打印格式(輸入…

【并發編程篇】源碼分析,手動創建線程池

文章目錄 &#x1f6f8;前言&#x1f339;Executors的三大方法 &#x1f354;簡述線程池&#x1f386;手動創建線程池?源碼分析?代碼實現&#xff0c;手動創建線程池&#x1f388;CallerRunsPolicy()&#x1f388;AbortPolicy()&#x1f388;DiscardPolicy()&#x1f388;Dis…

LNPMariadb數據庫分離|web服務器集群

LNP&Mariadb數據庫分離&#xff5c;web服務器集群 網站架構演變單機版LNMP獨立數據庫服務器web服務器集群與Session保持 LNP與數據庫分離1. 準備一臺獨立的服務器&#xff0c;安裝數據庫軟件包2. 將之前的LNMP網站中的數據庫遷移到新的數據庫服務器3. 修改wordpress網站配置…

2023.12.24 關于 Redis 中 String 類型內部編碼 及 應用場景

目錄 String 類型內部編碼 3 種內部編碼方式 String 類型應用場景 Cache 緩存 鍵名命名規則 計數&#xff08;Counter&#xff09; 共享會話&#xff08;Session &#xff09; 手機驗證碼 總結 String 類型內部編碼 3 種內部編碼方式 int&#xff1a;用來表示 64 位 —…

vue3菜單權限管理實現

前提 你的菜單是根據路由動態生成的&#xff0c;具體可以參考這篇博客對el-menu組件進行遞歸封裝&#xff08;根據路由配置動態生成&#xff09; 描述 首先將路由分為常量路由constantRoute&#xff08;所有用戶都有的路由&#xff09;和異步路由asyncRoute&#xff08;需要動…

Gradle 插件

自定義Gradle插件 - 簡書

小天使的小難題:新生兒疝氣的關注與溫馨呵護

引言&#xff1a; 新生兒疝氣是一種在出生后可能出現的常見情況&#xff0c;雖然通常不會造成長期影響&#xff0c;但對于家長而言&#xff0c;了解如何正確應對新生兒疝氣是至關重要的。本文將深入探討新生兒疝氣的原因、癥狀&#xff0c;以及家長在面對這一問題時應該采取的…

1224. 交換瓶子(藍橋杯/圖論)

題目&#xff1a; 1224. 交換瓶子 - AcWing題庫 輸入樣例1&#xff1a; 5 3 1 2 5 4輸出樣例1&#xff1a; 3輸入樣例2&#xff1a; 5 5 4 3 2 1輸出樣例2&#xff1a; 2 思路&#xff1a;圖論 1.將對應的位置與當前的瓶子序列相連形成環。 2.最少交換次數能形成的最多…

Vue中的事件委托(事件代理)使用方法介紹

事件委托&#xff08;事件代理&#xff09; 將原本需要綁定在子元素上的事件監聽器委托在父元素上&#xff0c;讓父元素充當事件監聽的職務。 事件委托是一種利用事件冒泡的特性&#xff0c;在父節點上響應事件&#xff0c;而不是在子節點上響應事件的技術。它能夠改善性能&a…

如何理解JDK、JRE、JVM區別與聯系

摘要&#xff1a;JDK是 Java 語言的軟件開發工具包(SDK)。在JDK的安裝目錄下有一個jre目錄&#xff0c;里面有兩個文件夾bin和lib&#xff0c;在這里可以認為bin里的就是jvm&#xff0c;lib中則是jvm工作所需要的類庫&#xff0c;而jvm和 lib合起來就稱為jre。 一、JDK JDK(Ja…

【【迭代16次的CORDIC算法-verilog實現】】

迭代16次的CORDIC算法-verilog實現 -32位迭代16次verilog代碼實現 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …

第十四章Java博客

lambda就是數學中的“λ”的讀音&#xff0c;lambda表達式是基于λ演算而得名的&#xff0c;因為lambda抽象&#xff08;lambda abstraction&#xff09;表示一個匿名的函數&#xff0c;于是開發語言也將lambda表達式用來表示匿名函數&#xff0c;也就是沒有函數名字的函數。C#…