簡體   English   中英

在std :: vector上運行的多個線程:在這種情況下是否需要鎖?

[英]Multiple threads operating on std::vector: do I need a lock in this case?

我有一個“偵聽器”線程,它查看一個std::vector “接收器”,將其放入大小為MPI_Waitany receivers.size()的數組中,並對其執行MPI_Waitany ,它將返回元素數組中的索引完成接收操作。

然后,通過以下方式從接收器向量中刪除完成的元素:

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

但是,其他線程可以通過以下方式將元素推入“接收者”向量:

receivers.push_back(receiver_message);

這很危險嗎? 我知道,如果添加的元素導致C ++調整向量的大小,則迭代器可能變得無效,但是由於擦除中的迭代器發生在單個點上然后被丟棄,這不是出於我的目的進行的原子操作嗎?

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

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

即使元素0永不更改,仍需要鎖定嗎? (“請求”只是元素的成員)

謝謝

一個簡單的規則是,如果任何線程要寫入向量(寬松地翻譯為“以任何方式對其進行修改”),那么您需要對所有線程使用鎖以實現一致的視圖。

當且僅當向量嚴格為只讀時,您才可以不加鎖地通過。

在內部,STL中的向量被實現為該向量類型的連續內存塊。 修改矢量時,可能會在刪除舊內存之前調整內存塊的大小並將現有值復制到新位置。 多個並發訪問器可能會在舊位置更改此內部存儲器,因此必須鎖定。 最重要的是,vector保留了當前分配的大小和當前使用情況的內部計數,這些計數無論如何都不會同步。 您可以不進行同步而破壞內部記帳。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM