使用std::lock_guard std::lock_guard是一个方便的RAII(资源获取即初始化)类,用于在作用域结束时自动解锁互斥锁。这样可以避免忘记解锁互斥锁的问题: #include<iostream>#include<thread>#include<mutex>std::mutexmtx;intshared_data=0;voidincrement(){for(inti=0;i<10000;++i){std::lock_guard<std::mutex...
lock_guard(_Mutex& _Mtx, adopt_lock_t) : _MyMutex(_Mtx) {} // 只构造,不加锁 ~lock_guard() noexcept { _MyMutex.unlock(); } // unlock lock_guard(const lock_guard&) = delete; lock_guard& operator=(const lock_guard&) = delete; private: _Mutex& _MyMutex; }; 1)lock_guard对...
std::unique_lock也可以提供自动加锁、解锁功能,比std::lock_guard更加灵活 #include <QCoreApplication> #include <iostream> // std::cout #include <thread> // std::thread #include <mutex> // std::mutex, std::lock_guard #include <stdexcept> // std::logic_error std::mutex mtx; void print...
std::recursive_mutex,递归 Mutex 类。 std::time_mutex,定时 Mutex 类。 std::recursive_timed_mutex,定时递归 Mutex 类。 Lock 类(两种) std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。 std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。 其他类型...
lock_guard是不支持手动释放的。 一般来说,使用unique_lock比较多,除非追求极致的性能才会考虑使用lock_guard。 #include <iostream> #include <mutex> #include <thread> #include <deque> #include <condition_variable> #include <unistd.h> std::deque<int> q; std::mutex mtx; std::condition_variable ...
解锁(Unlocking):使用std::mutex::unlock()方法释放锁,使得等待的线程有机会获取锁并继续执行。 std::mutex mtx; int shared_data = 0; void thread_function() { std::lock_guard<std::mutex> lock(mtx); // 自动锁住和解锁 shared_data++; // 受保护的操作 ...
mtx1.unlock(); mtx2.unlock(); }return0; } ——> > > std::lock支持对多个锁锁定,并且避免死锁的出现,以下代码运行时有可能出现死锁的情况: voidfunc(std::mutex* mtx1, std::mutex* mtx2,intindex) { std::lock_guard<std::mutex>lock1(std::adopt_lock); ...
std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。 std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。 其他类型 std::once_flag std::adopt_lock_t std::defer_lock_t std::try_to_lock_t ...
std::mutex mtx; voidthreadFunc(std::queue<int>& q){while(true) {if(!q.empty) {std::lock_guard<std::mutex> ltx(mtx);intparam = q.front;q.pop;std::cout<<"param:"<< param <<std::endl;}}} 我们在threadFund函数中的出队列之前加了一把锁。这把锁是全局的,每个线程都要先拿到这把...
: _MyMutex(_Mtx) {//construct but don't lock}~lock_guard() _NOEXCEPT {//unlock_MyMutex.unlock(); } lock_guard(constlock_guard&) =delete; lock_guard&operator=(constlock_guard&) =delete;private: _Mutex&_MyMutex; }; 1. 2.