如何使用互斥锁保护矢量?

时间:2011-08-11 05:22:16

标签: c++ windows multithreading vector mutex

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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