Boost线程失败BOOST_ASSERT(px!= 0);

时间:2012-03-01 19:56:10

标签: c++ assert boost-thread

我创建了一个未来的对象,如下:

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线程。

2 个答案:

答案 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不是很兼容。