我有一個'偵聽器'線程,查看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永不改變,也需要一個鎖嗎? (「請求」僅僅是一個元素的部件)
由於
http://stackoverflow.com/questions/4346742/stl-vector-and-thread-safety – timrau