Frage Wie definiert man einen Vektor in C ++?


Ich möchte einen Vektor mit boost :: mutex wie folgt definieren:

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

Aber ich habe einen Fehler auf Linux:

/boost_1_45_0v/include/boost/thread/pthread/mutex.hpp:33: Fehler: âboost :: mutex :: mutex (const boost :: mutex &) â ist privat /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:104: Fehler: in diesem Zusammenhang

Ich kann keine Lösung finden, indem ich online suche.

Vielen Dank


5
2017-11-24 06:19


Ursprung


Antworten:


Du könntest einen Boost verwenden Zeiger-Container:

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

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

Ein ptr_vector übernimmt die Besitzer seiner Zeiger, so dass sie gelöscht werden, wenn dies ohne den zusätzlichen Aufwand, den ein intelligenter Zeiger einbringen könnte.


8
2017-11-24 12:21



Der Kopierkonstruktor ist privat. Du solltest keinen Mutex kopieren.

Verwenden Sie stattdessen:

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

und wenn Sie den Speicher nicht selbst verwalten möchten, verwenden Sie a boost::shared_ptr<boost::mutex> Anstatt von boost::mutex*


5
2017-11-24 06:23



boost::mutex kann nicht in einem gespeichert werden vector weil es nicht kopierbar ist. Wie in PeterTs Antwort erwähnt, ist es möglich, Zeiger auf den Mutex innerhalb der vector Stattdessen sollten Sie wahrscheinlich ein Design überdenken, das auf solchen Dingen beruht. Merken Sie sich vector selbst hat keine Threading-Anforderungen, und der Versuch, alles zu tun, um den Vektor zu modifizieren, wird keine Thread-sichere Operation sein.


2
2017-11-24 06:21