Сбой ускорения потока BOOST_ASSERT (px! = 0); - PullRequest
0 голосов
/ 01 марта 2012

Я создал объект будущего, как таковой:

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 ]

2 голосов
/ 02 марта 2012

В 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();
}
0 голосов
/ 02 марта 2012

Проблема "исправлена". Начал использовать Visual Studio и его компилятор. Boost thread и MinGW не очень совместимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...