Как определить вектор <boost :: mutex> в C ++? - PullRequest
5 голосов
/ 24 ноября 2011

Я хочу определить вектор с помощью 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: ошибка: в этом контексте

Я не могу найти решение путем поиска в Интернете.

спасибо

Ответы [ 3 ]

8 голосов
/ 24 ноября 2011

Вы можете использовать контейнер указателя для повышения :

#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 становится владельцем своих указателей, так что они удаляются, когда это уместно, без каких-либо накладных расходов, которые может внести интеллектуальный указатель.

5 голосов
/ 24 ноября 2011

Конструктор копирования является приватным.Вы не должны копировать мьютекс.

Вместо этого используйте:

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

, и если вы не хотите управлять памятью, используйте boost::shared_ptr<boost::mutex> вместо boost::mutex*

2 голосов
/ 24 ноября 2011

boost::mutex не может быть сохранен в vector, поскольку он не может быть создан для копирования.Как упоминалось в ответе PeterT, вместо vector можно хранить указатели на мьютекс, и вам, вероятно, стоит пересмотреть проект, основанный на таких вещах.Имейте в виду, что vector сам по себе не имеет требований к многопоточности, и попытка что-либо изменить вектор не будет потокобезопасной операцией.

...