簡體   English   中英

如何使用 Mutex 保護向量?

[英]How can I protect a vector with a Mutex?

我正在設計一個接受多個不同交互客戶端的 C++ 服務器,並且我使用向量來單獨跟蹤所有這些客戶端。 然而,我意識到,由於運行了這么多線程,一個向量可能被兩個線程同時讀取和寫入的可能性很小。 有沒有一種快速安全的方法來向它們添加互斥鎖或其他東西,以便它會等到所有讀取完成,直到另一個 function 添加到它? 不這樣做可能會弄亂協議,甚至可能導致服務器崩潰。

我有一個想法來創建一個全局變量,它將所有讀取鎖定到一個向量,但我不確定是否可以告訴線程也可以相互排除該變量(即不要將 bool 更改為 false 並在同時,使機制毫無意義)。

我正在使用 Windows 7(Visual Studio 2010 Pro)。 感謝您的任何建議!

最快的解決方案是用concurrent_vector替換std::vector 這個 class 模仿std::vector的接口,但對於並發讀寫是線程安全的。

但是,這將使代碼不可移植,因為concurrent_vector class 是 Microsoft Parallel Patterns Library的一部分,而不是 C++ 標准庫的一部分。 如果要保持可移植性,則必須使用Boost.Mutex (因為 VS2010 不支持std::mutex )來獲得每個線程對向量的獨占訪問權。 使用全局變量來防止並發訪問是沒有用的。

由於您使用的是 VS2010,因此您應該使用Concurrency::concurrent_vector 但請注意,此 class 存在限制,並且不是完全線程安全的。 您可以使用Concurrency::critical_sectionConcurrency::reader_writer_lock 當讀取多於寫入時,讀寫鎖會提供良好的性能。 您也可以使用 Windows本機讀寫器鎖,但僅支持 Windows Vista 和更高版本。

暫無
暫無

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

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