Сбой ускорения 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();
}
Другие вопросы по тегам