How to use a std::mutex in a class context

匿名 (未验证) 提交于 2019-12-03 03:08:02

问题:

i'm having some trouble using a C++11 std::mutex

in my class I have a variable called semaphore of type std::mutex.

So I positioned my semaphore.lock() and semaphore.unlock() before and after my critical section

class Database { public: Database(string, string, string, string); virtual ~Database();  struct sMyHome getMyHome(void); struct sPhysical getPhysical(int); struct sSystemInfo getSystemInfo(void); void commitSystemInfo(struct sSystemInfo); struct sTSensors getTSensors(int); struct sWireless getWireless(int); struct sWirelessConf getWirelessConf(int); struct sWirelessStatus getWirelessStatus(int);  private: void queryMyHome(void); void queryPhysical(int); void querySystemInfo(void); void queryTSensors(int ID); void queryWireless(int ID); void queryWirelessConf(int ID); void queryWirelessStatus(int ID); string toString(int);  struct sMyHome MyHome; struct sPhysical Physical[4]; struct sSystemInfo SystemInfo; struct sTSensors TSensors[32]; struct sWireless Wireless[64]; struct sWirelessConf WirelessConf[64]; struct sWirelessStatus WirelessStatus[64];  MYSQL *connection; mutex semaphore; }; 

this is part of the main, where I retrieve the error:

 Database db = Database("192.168.1.10", "****", "******", "******"); 

but the cross-compiler says

../main.cpp:8:73: error: use of deleted function 'Database::Database(const Database&)'   Database db = Database("192.168.1.10", "root", "raspberry", "DomoHome2");                                                                      ^ In file included from ../main.cpp:2:0: ../Database.h:79:7: note: 'Database::Database(const Database&)' is implicitly deleted      because the default definition would be ill-formed:  class Database {    ^ ../Database.h:79:7: error: use of deleted function 'std::mutex::mutex(const std::mutex&)'  In file included from ../Database.h:12:0,              from ../main.cpp:2: /Volumes/rpi-crosscompiler-toolchain/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include/c++/4.8.2/mutex:128:5: error: declared here  mutex(const mutex&) = delete;  ^ make: *** [main.o] Error 1 

and this is my constructor:

Database::Database(string Address, string Username, string Password, string Database) { // TODO Auto-generated constructor stub connection = mysql_init(NULL); mysql_real_connect(connection, Address.c_str(), Username.c_str(), Password.c_str(), Database.c_str(), 0, NULL, 0); } 

回答1:

std::mutex is neither copyable nor movable. Including one in your class necessitates that your class becomes non-copyable (-movable) as well. If you want your class to be copyable or movable, you will have to tell the compiler how objects of your class are to be copied or moved by implementing copy/move construction/assignment yourself. For example:

class synchronized_int {   mutable std::mutex mtx;   int value; public:   synchronized_int(int v = 0) : value(v) {}    // Move initialization   synchronized_int(synchronized_int&& other) {     std::lock_guard<std::mutex> lock(other.mtx);     value = std::move(other.value);     other.value = 0;   }    // Copy initialization   synchronized_int(const synchronized_int& other) {     std::lock_guard<std::mutex> lock(other.mtx);     value = other.value;   }    // Move assignment   synchronized_int& operator = (synchronized_int&& other) {     std::lock(mtx, other.mtx);     std::lock_guard<std::mutex> self_lock(mtx, std::adopt_lock);     std::lock_guard<std::mutex> other_lock(other.mtx, std::adopt_lock);     value = std::move(other.value);     other.value = 0;     return *this;   }    // Copy assignment   synchronized_int& operator = (const synchronized_int& other) {     std::lock(mtx, other.mtx);     std::lock_guard<std::mutex> self_lock(mtx, std::adopt_lock);     std::lock_guard<std::mutex> other_lock(other.mtx, std::adopt_lock);     value = other.value;     return *this;   } }; 


回答2:

Declare your mutex dynamically and not statically.

At your Database class header declare the mutex as a pointer, like that:

mutex * semaphore; 

and at your constructor initialize the mutex calling his constructor:

semaphore = new std::mutex(); 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!