我创建了一个未来的对象,如下:
Future.h
#ifndef FUTURE_H_
#define FUTURE_H_
#include "../interfaces/IFuture.h"
#include <stdio.h>
#include <boost/thread.hpp>
using namespace boost;
class Future: public IFuture {
private:
void** data;
bool isDataReady;
mutex mut;
condition_variable cond;
public:
Future();
~Future();
bool isReady();
void setData(void* data[]);
void** getData();
};
#endif /* FUTURE_H_ */
Future.cpp
#include "../headers/Future.h"
Future::Future(){
this->data = NULL;
this->isDataReady = false;
}
Future::~Future(){
delete [] data;
}
bool Future::isReady(){
return isDataReady;
}
void Future::setData(void* data[]){
if(isDataReady)
return;
{
lock_guard<mutex> lock(mut);
this->data = data;
isDataReady = true;
}
cond.notify_one();
}
void** Future::getData(){
unique_lock<mutex> lock(mut);
while(!isDataReady){
cond.wait(lock);
}
return data;
}
主应用程序根据需要创建多个Future对象。 第一个对象工作正常,但在第一百个Future对象周围,condition.wait(mut)失败了BOOST_ASSERT(px!= 0);在intrusive_ptr.hpp。
我不明白为什么会这样。
我在mingw g ++编译器的windows中使用boost线程。
答案 0 :(得分:2)
在Future::setData
中你解锁了一个你没有持有的互斥锁(因为它由lock_guard
对象处理):
void Future::setData(void* data[]){
if(isDataReady)
return;
{
lock_guard<mutex> lock(mut);
this->data = data;
isDataReady = true;
}
mut.unlock(); // <=== remove this
cond.notify_one();
}
答案 1 :(得分:0)
问题&#34;已修复&#34;。开始使用Visual Studio及其编译器。提升线程和MinGW不是很兼容。