簡體   English   中英

boost :: mutex發布VS調試版本

[英]boost::mutex Release VS Debug Build

我正在建立一個基於PCL的應用程序,對於該應用程序,它使用velodyne的默認PCL抓取程序代碼,可以在此處看到。

當我在Debug模式下構建應用程序時,它可以按預期運行,但是在Release版本中,雲被跳過,而我松散了一兩個雲。 我縮小到互斥體存在一些我沒有經驗的問題。

// Retrieved Point Cloud Callback Function
boost::mutex mutex;
boost::function<void(const pcl::PointCloud<PointType>::ConstPtr&)> function =[&cloud, &mutex](const pcl::PointCloud<PointType>::ConstPtr& ptr)
{
    boost::mutex::scoped_lock lock(mutex);
    // Point Cloud Processing
    cloud = ptr;
};

這是接收我的雲的回電,下面是主要部分

while (!viewer->wasStopped())
{
    viewer->spinOnce(); // Update Viewer
    tStart = clock();
    boost::mutex::scoped_try_lock  lock(mutex);

我不知道為什么發行版和調試版之間會有差異。 有什么建議么? 我使用Visual Studio 2017和PCL 1.8.1。

看一下您的第二段代碼片段,“ main部分”:

boost::mutex::scoped_try_lock lock(mutex);

在這里讓我感到困惑。 try_lock嘗試鎖定互斥鎖。 如果當前正在使用互斥鎖,它將無法鎖定互斥鎖並繼續執行。 互斥鎖之后的塊可能會受到或可能不會受到互斥鎖的保護。

那真的是您想要做的嗎? 您是否檢查了鎖的狀態?

還是您打算使用

boost::mutex::scoped_lock lock(mutex);

這將阻止線程執行,直到可以訪問互斥量為止。 此語句之后的塊將始終受互斥鎖保護。

使用try_lock ,發生的情況是,如果無法鎖定互斥鎖,則將繼續執行而無需鎖定。 您有責任處理此案。 如果不這樣做,則互斥鎖將完全無效,並且會出現爭用情況,不安全的並發訪問和其他問題。

這也可能是您的程序在發行版本和調試版本中行為不同的原因。 在發行版中,程序的某些部分運行得更快,因此計時行為完全不同。 可能是因為在Debug中的時間安排使得永遠不會同時訪問互斥量旨在保護的數據結構。 但是在發行版中,這將完全不同。

總結一下:除非您有意使用scoped_try_lock (實際上是內部幫助器類afaik), scoped_lock您可能打算使用scoped_lock

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM