Boost Mutex try_lock断言失败

时间:2015-02-05 14:15:18

标签: c++ ubuntu boost mutex ubuntu-14.04

我想使用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

但错误仍然存​​在。

我该怎么做才能解决我的机器的这种行为?

0 个答案:

没有答案