我正在使用ROS(机器人操作系统)框架。如果您熟悉ROS,则在我的代码中,我没有使用活动服务器。主要使用发布者,订阅者和服务。不幸的是,我面临着pthread_recursive_mutex错误的问题。以下是错误及其回溯。
如果有人熟悉ROS堆栈,可以请您分享可能导致此运行时错误的潜在原因吗?
我可以提供有关运行时错误的更多信息。帮助非常感谢。谢谢
/usr/include/boost/thread/pthread/recursive_mutex.hpp:113: void boost::recursive_mutex::lock(): Assertion `!pthread_mutex_lock(&m)' failed.
lock
方法实现仅声明pthread返回值:
void lock()
{
BOOST_VERIFY(!posix::pthread_mutex_lock(&m));
}
这意味着根据文档,或者:
(EAGAIN
)无法获取互斥,因为最大数量为互斥量的递归锁已被超出。
这将表明您的锁存在某种不平衡(不是此呼叫站点,因为unique_lock<>
确保不会发生这种情况),或者只是使所有等待同一锁的线程处于机架状态
(EOWNERDEAD
)互斥锁是一个健壮的互斥锁,并且包含持有互斥锁时,先前拥有的线程终止。互斥量锁应由调用线程获取,并且取决于新线程所有者以使状态保持一致。
Boost不处理这种情况,只是断言。如果您所有的线程都使用线程安全锁防护(scoped_lock
,unique_lock
,shared_lock
,lock_guard
),则也不太可能发生这种情况。但是,如果您在某处手动使用lock()
(和unlock()
)功能并且没有unlock()
ing
[还有其他一些方式(尤其是经过检查)互斥可能会失败,但不适用于boost::recursive_mutex