【问题标题】:How can I protect a vector with a Mutex?如何使用 Mutex 保护向量?
【发布时间】:2011-08-11 05:22:15
【问题描述】:

我正在设计一个接受多个不同交互客户端的 C++ 服务器,并且我使用向量来单独跟踪所有客户端。然而,我意识到,由于运行了这么多线程,一个向量可能被两个线程同时读取和写入的可能性很小。是否有一种快速安全的方法可以向它们添加互斥锁或其他东西,以便它会等到所有读取完成,直到另一个函数添加到它?不这样做可能会弄乱协议,甚至可能导致服务器崩溃。

我有一个想法来创建一个全局变量,它将所有读取锁定到一个向量,但我不确定是否可以告诉线程也相互排除该变量(即不要将 bool 更改为 false 并将其检查为同时为真,使机制毫无意义)。

我使用的是 Windows 7 (Visual Studio 2010 Pro)。感谢您的任何建议!

【问题讨论】:

    标签: c++ windows multithreading vector mutex


    【解决方案1】:

    最快的解决方案是将std::vector 替换为concurrent_vector。此类模仿std::vector 的接口,但对于并发读写来说是线程安全的。

    但是,这将使代码不可移植,因为 concurrent_vector 类是 Microsoft Parallel Patterns Library 的一部分,而不是 C++ 标准库的一部分。如果要保持可移植性,则必须使用Boost.Mutex(因为VS2010 不支持std::mutex)来获得每个线程对向量的独占访问权。使用全局变量来防止并发访问是没有用的。

    【讨论】:

      【解决方案2】:

      由于你使用的是 VS2010,你应该使用Concurrency::concurrent_vector。但请注意,此类存在限制,并且不是完全线程安全的。您可以使用Concurrency::critical_sectionConcurrency::reader_writer_lock。当读取多于写入时,读写锁会提供良好的性能。您也可以使用 Windows native Reader-writer 锁,但仅支持 Windows Vista 和更高版本。

      【讨论】:

        猜你喜欢
        • 2018-11-06
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-15
        • 2016-11-05
        • 1970-01-01
        • 2018-01-04
        相关资源
        最近更新 更多