2009-10-30 32 views
3

是否有辦法來自動鎖定訪問一個STL容器,而無需鎖定和它周圍的釋放?c + +的boost ::線程並自動鎖定容器

+1

另一方面,請注意,任何共享資源都是威脅應用程序並行性的爭用點,所以您最好保持最低限度。 – 2009-10-30 07:16:42

+1

我不知道的方法來自動做到這一點,這是不是一個真正的問題,因爲你通常都需要在原子比個體容器的方法,範圍更廣。例如,您通常希望在插入容器之前在容器中進行搜索。在這種情況下,搜索和插入必須在一個原子塊中進行,而不是兩個。另一個「自動鎖定」容器不會購買任何東西的地方是在該容器中的迭代器上使用STL算法。 – 2009-10-30 13:20:22

回答

5

的currrent C++標準不說有關STL容器線程安全的東西。正式的STL實現有可能是線程安全的,但這是非常不尋常的。如果您的STL實現不是線程安全的,那麼您需要「鎖定並釋放它」或者找到其他方式來協調訪問。

你可能有興趣在英特爾的Threading Building Blocks,其中包括類似於STL容器的一些線程安全的容器。

+0

+1提TBB – 2009-10-30 13:14:43

2

多的谷歌搜索後,似乎這樣做是爲了創建一個在你的容器的包裝方式。例如:

template<typename T> 
class thread_queue 
{ 
private: 
    std::queue<T> the_queue; 
    mutable boost::mutex the_mutex; 
    boost::condition_variable the_condition_variable; 
public: 
    void push(T const& data) 
    { 
     boost::mutex::scoped_lock lock(the_mutex); 
     the_queue.push(data); 
     lock.unlock(); 
     the_condition_variable.notify_one(); 
    } 
    etc ... 
} 
+0

你應該擁有鎖,當你調用的boost :: condition_variable :: notify_one() – 2009-10-30 06:24:08

+0

此外,你應該給你的條件變量,如「not_empty」和「not_full」一個合適的名字,因爲這些都是條件線程可能要等待。 – sellibitze 2009-10-30 08:12:11