2012-03-17 21 views
1

是對下面的代碼線程安全:C++的標準::矢量和線程安全

螺紋的

std::vector<std::string> myCopy; 
    with_locked_mutex(m) { 
    myCopy = sharedCopy; 
    } 
    myCopy.clear() etc. // -- a 

線程B

while(1) { 
    // do things ... 
    with_locked_mutex(m) { 
     sharedCopy.push_back(a); // -- b 
    } 
    } 

換言之,將性病的COW語義:: vector(以及std :: string也是這樣,我想)在a和b之間創建競爭條件?如果是這樣,我能做些什麼來阻止它?

+1

誰告訴你'vector'有COW語義? (另外,它更像是「以COW實現」,因爲這不是語義的一部分。) – 2012-03-17 09:48:14

回答

3

假設with_locked_mutex(m) { something }以某種方式確保在代碼塊之前獲取互斥體並在之後釋放,這兩個操作將在互斥模式下運行,所以不會有問題。

std::vector無論如何都不能使用copy-on-write。

2

AFAIK,std::vector沒有COW語義。賦值運算符和拷貝構造函數總是複製每個元素。