互斥锁因参数无效而失败是啥意思?
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);
【讨论】:
以上是关于互斥锁因参数无效而失败是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章