为什么我收到一个简单的提升生产者/消费者计划的锁定断言失败
Why am I receiving a lock assertion failure for a simple boost producer/consumer program?
我正在努力使用单独的类、c++ 标准库 deques 和 Linux 上的提升线程来创建一个简单的线程生产者/消费者示例。我正在通过引用将共享缓冲区、锁和条件变量作为成员变量传递给我的类。线程启动正常,但由于锁断言错误,通常会随机崩溃。
main: ../nptl/pthread_mutex_lock.c:80: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
这是我在 main 中启动线程的方式
std::deque<double> buf;
boost::condition_variable_any buf_has_space;
boost::condition_variable_any buf_has_data;
boost::mutex buf_lock;
boost::thread producerThread(load_func, &buf, &buf_has_space, &buf_has_data, &buf_lock);
boost::thread consumerThread(consume_func, &buf, &buf_has_space, &buf_has_data, &buf_lock);
producerThread.join();
consumerThread.join();
producerThread
和consumerThread
初始化并运行myProducer
和myConsumer
的实例。
来自myProducer
的相关代码:
void myProducer::add_to_buffer(){
//Main loop
for (int i=0; i<100000; i++){
boost::mutex::scoped_lock lock(*buffer_lock);
while (buffer->size() == max_size){
buffer_has_space->wait(*buffer_lock);
}
buffer->push_back(i);
buffer_has_data->notify_one();
buffer_lock -> unlock();
}
//Consumer will stop when it sees -1
boost::mutex::scoped_lock lock(*buffer_lock);
while (buffer->size() == max_size){
buffer_has_space->wait(*buffer_lock);
}
buffer->push_back(-1.0);
buffer_has_data->notify_one();
buffer_lock -> unlock();
}
来自myConsumer
的相关代码:
void myConsumer::load_from_buffer(){
double current = 0;
while (current != -1.0) {
boost::mutex::scoped_lock lock(*buffer_lock);
while (buffer->size() == 0){
buffer_has_data->wait(*buffer_lock);
}
current = buffer->front();
buffer->pop_front();
buffer_has_space->notify_one();
buffer_lock->unlock();
std::cout << current <<"n";
}
}
我看过这些问题:
pthread_mutex_lock.c:62: __pthread_mutex_lock:断言"互斥>__data.__所有者 == 0"失败
线程互斥断言错误
但是,在我的类被解构之前,程序崩溃了,并且每个锁都与同一线程中的解锁匹配。
如果您的锁由锁卫 (scoped_lock) 拥有,则手动操作锁是错误的。
如果必须在作用域结束之前操作锁,则可以在scoped_lock
本身上执行此操作:
lock.unlock(); // instead of buffer_lock -> unlock();
相关文章:
- 如何让C++'tally up'结果并制定计划?
- 消费者和生产者问题的双重缓冲
- 生产者使用者在 cpp 中使用互斥锁的问题
- 如何降低生产者获得锁的可能性,而消费者在使用std::condition_variable时无法获得锁?
- C++ deque 消费者总是从生产者那里得到空队列
- C++窗口的计划问题
- 回复计划游戏结果不会显示
- 用于免等待生产者和阻塞使用者的环形缓冲区
- 使用通常称为 API 实现C++多个客户和生产者解决方案,这是否有效?
- CSActiveMQ CPP 生产者 - 一个会话可以使用多个队列吗?
- C++多线程生产者-消费者问题
- 我正在努力处理多维数组输入和输出,我管理输入,但是打印无法按计划工作
- 生产者和消费者优化
- 如何从文本文件输出数据?(学生成绩单计划)
- 为什么在此计划中,我在所有情况下都获得 0%?
- Windows 并发运行时任务计划,但有例外
- C++航班预订计划
- 如何计划在将来时间运行的操作
- 特定的生产者-消费者方案
- 为什么我收到一个简单的提升生产者/消费者计划的锁定断言失败