[英]C++ Access to vector from multiple threads
在我的程序中,我運行了一些線程。 每個線程都獲得一個指向某個對象的指針(在我的程序中 - 向量)。 每個線程都會修改矢量。
有時我的程序會因為segm-fault而失敗。 我以為它發生了,因為線程A開始用向量做某事而線程B還沒有用它完成操作? 它真的可以嗎?
我該怎么辦呢? 線程同步? 或者也可以制作一個標志VectorIsInUse
並在使用它時將此標志設置為true?
與所有STL容器一樣, vector
不是線程安全的。 您必須自己明確管理同步。 可以使用std::mutex
或boost::mutex
來同步對vector
訪問。
不要使用標志,因為這不是線程安全的:
isInUse
標志的值,它是false
isInUse
標志的值,它是false
isInUse
設置為true
isInUse
為false
並將其設置為true
vector
請注意,每個線程都必須在需要使用它的整個時間內鎖定vector
。 這包括修改vector
和使用vector
的迭代器,因為如果它們引用的元素是erase()
或vector
經歷內部重新分配,則迭代器可能變為無效。 例如,不要 :
mtx.lock();
std::vector<std::string>::iterator i = the_vector.begin();
mtx.unlock();
// 'i' can become invalid if the `vector` is modified.
如果您想要一個可以安全地使用多個線程的容器,則需要使用為此目的明確設計的容器。 標准容器的接口不是為並發變異或任何類型的並發而設計的,您不能只是對問題進行鎖定。
你需要像TBB或PPL這樣的東西,其中包含concurrent_vector
。
這就是為什么幾乎每個提供線程的類庫都有同步原語,如互斥鎖/鎖。 您需要設置其中一個,並在共享項的每個操作周圍獲取/釋放鎖(讀取和寫入操作,因為您還需要防止在寫入期間發生讀取,而不僅僅是防止多個寫入同時發生)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.