簡體   English   中英

C ++從多個線程訪問矢量

[英]C++ Access to vector from multiple threads

在我的程序中,我運行了一些線程。 每個線程都獲得一個指向某個對象的指針(在我的程序中 - 向量)。 每個線程都會修改矢量。

有時我的程序會因為segm-fault而失敗。 我以為它發生了,因為線程A開始用向量做某事而線程B還沒有用它完成操作? 它真的可以嗎?

我該怎么辦呢? 線程同步? 或者也可以制作一個標志VectorIsInUse並在使用它時將此標志設置為true?

與所有STL容器一樣, vector不是線程安全的。 您必須自己明確管理同步。 可以使用std::mutexboost::mutex來同步對vector訪問。

不要使用標志,因為這不是線程安全的:

  • 線程A檢查isInUse標志的值,它是false
  • 線程A被暫停
  • 線程B檢查isInUse標志的值,它是false
  • 線程B將isInUse設置為true
  • 線程B被暫停
  • 線程A恢復
  • 線程A仍然認為isInUsefalse並將其設置為true
  • 線程A和線程B現在都可以訪問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.

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