使用无效参数的互斥锁失败是什么意思?

时间:2015-05-07 00:52:30

标签: c++ boost

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

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

&#39;类bounded_buffer&#39;的代码完全如此增强示例页面所示... 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)
    }*/
}

1 个答案:

答案 0 :(得分:9)

函数返回并且bb被破坏但线程仍在运行。当m_container尝试使用互斥锁时,它(以及整个m_container)不再存在。

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

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

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

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);