Сбой ускорения BOOST_ASSERT( px!= 0);
Я создал объект будущего, как таковой:
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 условие.wait(mut) завершается с ошибкой BOOST_ASSERT( px!= 0); в intrusive_ptr.hpp.
Я не понимаю, почему это происходит.
Я использую Boost Thread в Windows на компиляторе Mingw G ++.
2 ответа
Решение
Проблема "исправлена". Начал использовать Visual Studio и его компилятор. Boost thread и MinGW не очень совместимы.
В 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();
}