1,使用std::atomic定义,可以变量在进行简单的运算中保持原子性!
std::atomic_int a; std::atomic<int> a;2,使用临界区mutex,可以对一段代码加锁
std::mutex m_mutex; m_mutex.lock() { code body; } m_mutex.unlock()问题:如果出现异常,可能没有进行解锁;加锁解锁复杂。
3,自定义锁
class Lock { public: Lock(std::mutex &_mutex) :mutex(_mutex) { mutex.lock(); } ~Lock() { mutex.unlock(); } private: std::mutex& mutex; }; /*使用*/ void addcount(){ Lock lock(mutex)//是一个mutex量,这里mutex和cout都同属于一个对象,这样方便 cout++; }在结束祈构时自动解锁
同3问题:需要对同一个mutex加锁;在对同一个对象操作时,可以在该对象中添加一个mutex对象。对于多个对象,则出现问题。
4,C++自带,在函数开头使用
std::lock_guard<std::mutex> lock(m_mutex)5,多对象操作,如果自己编写的话,主要是保持加锁的顺序一致,比如利用地址进行加锁排序。
void addcount(a,b){ std::lock(a.Mutex,b.Mutex),把Mutex完全锁住多个,同时? std::lock_guard<std::mutex> lockA(a.Mutex,atd::adopt_lock); //第二个参数告诉已经被锁住了,只在结束时调用unlock std::lock_guard<std::mutex> lockB(b.Mutex,atd::adopt_lock); { 对a、b对象操作 } }
