互斥锁因参数无效而失败是啥意思?

Posted

技术标签:

【中文标题】互斥锁因参数无效而失败是啥意思?【英文标题】:What does mutex lock fail with invalid argument mean?互斥锁因参数无效而失败是什么意思? 【发布时间】:2015-05-07 00:52:29 【问题描述】:

这段代码在我的主进程中被调用并且编译正常,但是执行时总是抛出下面的错误。

bounded_buffer<MyData> bb(200);
Producer<bounded_buffer<MyData> > producer(&bb);

boost::thread produce(producer); // throws on this line

这是执行时总是出现的错误。

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error> >'  
what():  boost: mutex lock failed in pthread_mutex_lock: Invalid argument

'class bounded_buffer' 的代码与这个 boost 示例页面上的完全一样...http://www.boost.org/doc/libs/1_55_0/libs/circular_buffer/example/circular_buffer_bound_example.cpp

我在这里找到了这个页面,它似乎显示了完全相同的内容,但我无法理解给出的答案。 Boost scoped_lock failed everytime

更新: 这是调用函子时 Producer::operator() 当前所做的事情。以及我想要这个线程做的事情的意图。

void operator() () 
    //init();
    //read();

    // this line just a test
    m_container->push_front(value_type());

    /*Eventually will do the following:
    while (1) 
         read_from_usb_device();
         // then store data in global buffer (bb)
    */

【问题讨论】:

真的会扔到那条线上吗?创建线程不使用互斥锁。创建线程后你会做什么?我怀疑bb 在线程仍在运行时被破坏了。 我没有看到线程上的连接。你确定 bb 不会超出范围吗? @StenSoft - 如果我注释掉线程行,我不会收到该错误。重载的 operator() 当前只是将数据放在全局缓冲区 (bb) 上,但最终会运行循环从设备读取数据。 @Ender 您没有收到错误,因为它根本不会启动线程。这并不意味着那里会抛出异常。 @Ender 我想知道你在boost::thread produce(producer);之后做什么? 【参考方案1】:

函数返回,bb 被销毁,但线程仍在运行。当m_container 尝试使用互斥体时,它(连同整个m_container)不再存在。

您需要等待线程结束才能销毁它使用的任何数据:

boost::thread produce(producer);
produce.join();

或者您需要将数据的所有权传递给线程,例如。使用std::shared_ptr(如果您想与Consumer 共享缓冲区,如Boost 示例中一样,但与未加入线程的示例不同):

auto bb = std::make_shared<bounded_buffer<MyData> >(200);
Producer<bounded_buffer<MyData> > producer(bb);
Consumer<bounded_buffer<MyData> > consumer(bb);
boost::thread produce(producer);
boost::thread consume(consumer);

【讨论】:

以上是关于互斥锁因参数无效而失败是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用全局互斥锁的好模式是啥?

为啥互斥锁不需要互斥锁(而互斥锁需要互斥锁......)

锁详解区分 互斥锁⾃旋锁读写锁乐观锁悲观锁

简单的定制互斥锁失败

销毁锁定的互斥锁时 pthread_mutex_destroy 的正确行为是啥

C# 互斥量处理