2012-03-01 34 views
0

我已經創建了一個未來對象,因爲這樣的:Boost線程失敗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對象的condition.wait(mut)失敗了BOOST_ASSERT(px!= 0);在intrusive_ptr.hpp中。

我不明白爲什麼會發生這種情況。

我在mingw g ++編譯器的窗口中使用boost線程。

+1

Boost已經提供了未來的對象。 http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html#thread.synchronization.futures – kennytm 2012-03-01 20:04:35

+0

我意識到這一點。我不想被綁定到特定的實現。如果更進一步,我希望使用pthreads,我只需要更改我的Future對象。無論如何,我的實施有問題嗎? – rjmarques 2012-03-01 20:07:55

+1

你能用最簡單的例子來說明你如何使用未來嗎? – kennytm 2012-03-01 20:12:01

回答

1

問題「固定」。開始使用Visual Studio及其編譯器。 Boost線程和MinGW不是很兼容。

1

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

你說得對,我忘了刪除它。想想,它仍然給出了一個錯誤,圍繞迭代#64 ... =/ – rjmarques 2012-03-01 20:33:38

+0

如果我只創建了大約50個期貨,即做了50次迭代,沒有問題...不刪除Future的析構函數中的互斥和條件會產生問題? – rjmarques 2012-03-01 20:39:01

+0

問題是我使用MinGW的事實?我已經指定了-mthreads標誌,但即使如此也不起作用... = / – rjmarques 2012-03-01 21:51:39