我想使用Boost Mutex来保护软件组件。
在一种方法中,我使用boost::lock_guard
并且效果很好。
在另一种方法中,我无法使用lock_guard
,因为我需要非阻塞行为。
以下是我如何使用互斥锁的一个小例子:
#include <boost/thread/mutex.hpp>
boost::mutex mutex_lock;
int main(int argc, char **argv)
{
bool ret = mutex_lock.try_lock();
if(ret != true)
std::cout << "failed" << std::endl;
else
{
std::cout << "yeah" << std::endl;
mutex_lock.unlock();
}
}
在使用Boost 1.54的Ubuntu 14.04上,我使用g++ mutex_test.cpp -lboost_system -lpthread
该程序输出:
yeah
a.out: /usr/include/boost/thread/pthread/mutex.hpp:108: boost::mutex::~mutex(): Assertion `!posix::pthread_mutex_destroy(&m)' failed.
Aborted (core dumped)
我还写了一个小的C程序,直接用pthread_mutex_trylock
做同样的事情,这很好用。
在gdb中,我注意到在__nusers
调用之前,互斥锁的mutex_lock.unlock()
变量为零。通话结束后,此值为4294967295
。
gdb中的完整输出是:
(gdb) n
yeah
13 mutex_lock.unlock();
(gdb) p mutex_lock
$2 = {m = {__data = {__lock = 1, __count = 0, __owner = 0, __nusers = 0, __kind = 0, __spins = 0, __elision = 3, __list = {__prev = 0x0, __next = 0x0}}, __size = "\001", '\000' <repeats 21 times>, "\003", '\000' <repeats 16 times>,
__align = 1}}
(gdb) n
15 }
(gdb) p mutex_lock
$3 = {m = {__data = {__lock = 0, __count = 0, __owner = 0, __nusers = 4294967295, __kind = 0, __spins = 0, __elision = 3, __list = {__prev = 0x0, __next = 0x0}},
__size = '\000' <repeats 12 times>, "\377\377\377\377\000\000\000\000\000\000\003", '\000' <repeats 16 times>, __align = 0}}
其他类似问题的答案是他们正在解锁已经解锁的互斥锁,但在本示例程序中并非如此。
我也尝试使用boost::unique_lock<boost::mutex> lock(mutex_lock, boost::try_to_lock);
而不是手动解锁它,但这会导致相同的断言失败。
我使用互斥锁是错误的吗?
编辑:此代码适用于我测试过的其他三台计算机。在我的机器上,我现在做了:
sudo apt-get --reinstall install libc6 libboost-system1.54.0 libboost-thread1.54.0
但错误仍然存在。
我该怎么做才能解决我的机器的这种行为?