2014-02-27 29 views
1

這是我第一次使用線程,並且我正在使用boost。 情況是,我有一個三維多邊形網格的大陣列,爲此我構建了一個八叉樹(每個網格一棵樹)。 我想要並行執行構建過程,並立即轉到openGL顯示循環 - 無需等待構建完成。 (該對象根本不會顯示任何東西,直到它的八度完成)。boost線程 - 是scoped_ptr :: reset()一個原子操作?

我使用boost :: scoped_ptr :: reset()將八叉樹數據附加到我的對象。 我可以認爲reset()方法是線程執行中的原子操作嗎?如果不是,我應該照顧什麼?

下面是描述我在做什麼的僞代碼。 實際的代碼按預期工作,但我遇到偶爾崩潰(可能與其他不便。)

class BigData 
{ 
private: 
    boost::scoped_ptr<float*> p_data_; 

public: 
    void Compute() // this will run in threads 
    { 
     float* p_temp = new float [1000]; 
     DoComputation(p_temp); 
     p_data_.reset(p_temp); // atomic ? 
    } 
    void operator()() {Compute();} 

    void Display() // do nothing if p_data_ is not ready 
    { 
     if(p_data_) 
      DoDisplay(); 
    } 
} 


int main() 
{ 
    std::vector<BigData> objects_arr(1000); 

    // run Compute() in threads 
    for(int i=0; i<objects_arr.size(); ++i) 
     boost::thread comp_thread(objects_arr[i]); 

    // immediately go to display 
    while(true) 
    { 
     for(int i=0; i<objects_arr.size(); ++i) 
      objects_arr[i].Display(); 
    } 

} 
+0

1)scoped_ptr與線程同步沒有關係,btw也不是原子操作。和2)你使用scoped_ptr以非常奇怪的方式.... – alexbuisson

回答

0

類像scoped_array,scoped_ptr的,shared_ptr的只是不同的實施RIIA模式,而不是thread-安全。所以如果你想在可能發生數據競爭的多線程上下文中使用這些類,你必須自己使用同步原語來保護這些變量。

定義scoped_ptr時,你不必提及它將存儲ptr。它的設計,所以我們可以這樣寫:

 boost::scoped_ptr<float> p_data_; 

,看着你的代碼,我認爲你想寫:

void Compute() // this will run in threads 
{ 
    boost::scoped_array<float> p_data(new float [1000]); 
    DoComputation(p_data.get()); 
    // no need to call reset ... 
} 

我代替scoped_array與scoped_array,因爲如果你分配一些與新[ ]你必須使用delete []和scoped_array來釋放它!

我們也可以刪除調用重置,因爲由scoped_ ..類提供的RIIA模式通過設計提供了該行爲。當標識符超出範圍資源被釋放時。