【问题标题】:how to define a vector<boost::mutex> in C++ ?如何在 C++ 中定义向量<boost::mutex>?
【发布时间】:2012-01-05 09:04:04
【问题描述】:

我想用 boost::mutex 定义一个向量:

  boost::mutex myMutex ;
  std::vector< boost::mutex > mutexVec; 
  mutexVec.push_back(myMutex); 

但是,我在 Linux 上遇到了错误:

/boost_1_45_0v/include/boost/thread/pthread/mutex.hpp:33:错误:“boost::mutex::mutex(const boost::mutex&)”是私有的 /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:104:错误:在此上下文中

我无法通过在线搜索找到解决方案。

谢谢

【问题讨论】:

  • mutexVec.push_back(myMutex); 应该做什么?

标签: c++ boost vector mutex


【解决方案1】:

您可以使用提升pointer container

#include <boost/thread.hpp>
#include <boost/ptr_container/ptr_vector.hpp>

boost::ptr_vector<boost::mutex> pv;
pv.push_back(new boost::mutex);

ptr_vector 拥有其指针的所有权,以便在适当的时候删除它们,而不会产生智能指针可能引入的任何开销。

【讨论】:

  • +1 -- 仍然请注意,在插入过程中将互斥锁插入所述容器会使容器的线程安全性无效......
  • @BillyONeal "使容器的线程安全无效"什么线程安全?
  • @curiousguy:使用 STL 容器,多个阅读器通常是安全的。多个作家不是。
【解决方案2】:

复制构造函数是私有的。您不应该复制互斥体。

改为使用:

boost::mutex *myMutex = new boost::mutex();
std::vector< boost::mutex *> mutexVec; 
mutexVec.push_back(myMutex);

如果您不想自己管理内存,请使用 boost::shared_ptr&lt;boost::mutex&gt; 而不是 boost::mutex*

【讨论】:

  • 请不要将原始指针放在 STL 容器中。这就像杀死小狗一样。请注意,尽管shared_ptr 具有您需要注意的线程特性...
  • @BillyONeal "你需要注意的线程特性..." 比如效率低下?
  • @curiousguy:取决于您的特定实现。有时它只是效率低下。有时它会导致竞争条件或其他情况。
【解决方案3】:

boost::mutex 不能存储在 vector 中,因为它不可复制构造。正如 PeterT 的回答中提到的,可以将指向互斥锁的指针存储在 vector 中,您真的应该重新考虑依赖这些东西的设计。请记住,vector 本身没有任何线程要求,尝试对向量进行任何修改都不是线程安全操作。

【讨论】:

  • 没有任何线程要求”什么意思?
  • @curiousguy:我的意思是标准没有说明哪些操作会影响线程。标准中几乎没有任何要求。
  • 不要求你可以在不同的线程中同时调用两个函数...
  • @curiousguy:我有没有说别的?通常,当某些内容未记录为线程安全时,您必须假设它是线程不安全的。
  • 所以你不能在多线程程序中安全地做任何事情。甚至不调用两个不同的函数,甚至不使用运算符。什么都没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多