2013-09-29 82 views
0

我有一個'偵聽器'線程,查看std::vector'接收器',將它放入一個大小爲receivers.size()的數組中,並對其執行一個MPI_Waitany,它將返回完成接收操作的元素數組中的索引。在std :: vector上運行多個線程:在這種情況下,我需要一個鎖嗎?

被完成,然後從接收機矢量經由擦除的元件:

receivers.erase(receivers.begin() + completed_index); 

然而,其它線程可以推動元件與「接收機」矢量,而這是在進行,經由:

receivers.push_back(receiver_message); 

這是危險的嗎?我知道如果添加元素會導致C++重新調整向量大小,那麼迭代器可能會失效,但是由於我的擦除中的迭代器發生在單個點上,然後被丟棄,對我來說這不是一個原子操作嗎?

如果需要鎖定,那麼每次我想要訪問它的任何元素時都需要鎖定向量嗎?例如。

MPI_Start(&(receivers.at(0)->request)); 

即使元素0永不改變,也需要一個鎖嗎? (「請求」僅僅是一個元素的部件)

由於

+0

http://stackoverflow.com/questions/4346742/stl-vector-and-thread-safety – timrau

回答

3

的簡單的規則是,如果任何線程將要寫入到載體(其轉化鬆散爲「修改它以任何方式」 ),那麼你需要爲所有線程使用鎖來實現連貫的視圖。

當且僅當該向量是嚴格只讀的時候,您可以無鎖地獲得。

0

STL中的向量在內部實現爲該向量類型的連續內存塊。修改矢量時,可能會調整內存塊的大小,並在刪除舊內存之前將現有值複製到新位置。多個併發訪問器可能會改變舊位置的內部存儲器,因此必須鎖定。最重要的是,矢量保持內部計數的當前分配的大小和當前的使用情況,這是不同步的。您可以在不同步的情況下銷燬內部簿記。

相關問題