2010-09-17 72 views
4

我有一個關於Boost::ThreadMutex的新手問題。如何使用boost :: thread mutex來同步寫入權限?

我想先從以下Worker的許多平行的情況下,和所有的人都寫入同std::vector

struct Worker { 
    std::vector<double>* vec; 
    Worker(std::vector<double>* v) : vec(v) {} 
    void operator() { 
    // do some long computation and then add results to *vec, e.g. 
    for(std::size_t i = 0; i < vec->size(); ++i) { 
     (*vec)[i] += some_value; 
    } 
    } 
}; 

據我所知,勞動者有鎖定vec之前寫它和解鎖它完成後(因爲所有工作人員都寫入同一個向量)。但我怎麼表達呢?

回答

8

你需要一個boost ::互斥體,以保護載體,並且可以使用一個boost ::互斥:: scoped_lock的是將在它的構造函數鎖定互斥體,並在析構函數解鎖

請請記住,您需要使用同一個互斥體無處不在您可以在其中訪問vec的實例,無論是讀取還是寫入。

,讓你去,你可以這樣做:

struct Worker { 
    boost::mutex &vec_mutex; 

    Worker(std::vector<double>* v,boost::mutex &v_mutex) : vec(v),vec_mutex(v_mutex) {} 
    void operator() {   
    // do some long computation and then add results to *vec, e.g. 

    boost::mutex::scoped_lock lock(vec_mutex); 
    for(std::size_t i = 0; i < vec->size(); ++i) { 
     (*vec)[i] += some_value; 
    } 
    } 

}; 

對於更高級的東西,你應該進一步封裝載體和互斥,或遲早你會忘記,這些被連接的需求並且您將在某個地方訪問vec而不鎖定導致很難調試問題的鎖。對於這個例子中的問題,我寧願讓工作人員使用自己的獨立向量,並在工作完成後將結果合併到控制線程中。

+0

您是不是指'vec_mutex'而不是'io_mutex'? – Frank 2010-09-18 15:18:22

+0

是的,現在修好了。 – nos 2010-09-18 15:41:58

0

OT但有用的信息我希望 - 因爲你正在更新這個向量很多(或只是爲了最佳實踐)考慮iterators遍歷向量元素。通過不要求使用vector<double>::operator[]來加快工作者代碼速度將減少工作線程的總計等待時間。

for(std::vector<double>::iterator iter = vec->begin(); iter != vec->end(); ++iter) { 
    *iter += some_value; 
} 
+0

你確定這個更快嗎? Ay證明鏈接? – 2011-10-26 17:03:22

+1

迭代器減少到指針增量。該索引需要重複指針解引用(通過局部變量'vec'到達矢量),然後乘法來解析'operator []'。一個好的優化編譯器可能能夠將它們摺疊成相同的東西,但爲什麼要抓住這個機會呢?建議您對兩者進行編碼並比較在特定編譯器上生成的彙編代碼。 – 2011-10-26 21:08:05