BOOST :: MUTEX版本与调试构建



我正在扩大基于PCL的应用程序,为此使用默认的pcl grabber代码,用于velodyne,可以在此处看到。

当我在调试模式下构建应用程序时,它会根据期望工作起作用,但是在发布构建中,云正在跳过,我松开了一两个云。我缩小了一个事实,即互不及我没有经验的问题。

// 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;
};

这是接收我的云的回电,下面是Main

中的一部分
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尝试锁定Mutex。如果当前正在使用MUTEX,它将无法锁定MUTEX并继续执行。静音后的块可能会受到或可能不会被静音保护。

那真的是您想做的吗?您检查了锁的状态吗?

或您打算使用

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

将阻止螺纹执行,直到它可以访问静音。此语句之后的块将始终由静音。

使用try_lock,发生的事情是,如果它不能锁定互斥符,则执行将在没有锁定的情况下继续。您负责处理此案。如果您不这样做,则静音将完全无效,您将有比赛条件,不安全的并发访问和其他问题。

这也可能是您的程序在发布方面的行为与调试中的行为不同的原因。在发布程序的某些部分中,该程序运行速度要快得多,因此时间行为完全不同。可能是在调试中的时机,因此,静音旨在保护的数据结构永远不会同时访问。但是在发行中,这将完全不同。

总结一下:除非您故意使用scoped_try_lock(实际上是内部辅助类AFAIK(,您可能打算使用scoped_lock

最新更新