为全局变量 i 和std::cout对象加互斥锁:
#include <mutex> int i = 100; std::mutex iMutex; //用于共享变量 i 的互斥锁 std::mutex coutMutex; //用于共享资源cout的互斥锁
直接用mutex.lock()加锁:
mutex.lock(iMutex); //使用i mutex.unlock(iMutex); mutex.lock(coutMutex); //使用cout mutex.unlock(coutMutex);
创建类对象std::lock_guard<std::mutex> 加锁:
std::lock_guard<std::mutex> iLock(iMutex); //使用 i //ilock 对象销毁时,由析构函数释放锁 std::lock_guard<std::mutex> coutLock(coutMutex); //使用 i //coutLock 对象销毁时,由析构函数释放锁
以iMutex为参数创建一个std::lock_guard<std::mutex> 类对象的时候便对互斥量iMutex加了锁。
练习代码:
#include <iostream> #include <stdexcept> #include <thread> #include <mutex> int i = 100; std::mutex iMutex; std::mutex coutMutex; void th1() { std::lock_guard<std::mutex> coutlock(coutMutex); //coutMutex.lock(); std::cout << "begin of t1" << std::endl; //coutMutex.unlock(); std::lock_guard<std::mutex> iLock(iMutex); //iMutex.lock(); while ( (i--) >= 0 ) { //coutMutex.lock(); std::cout << "th1, i = " << i << std::endl; //coutMutex.unlock(); } //coutMutex.lock(); std::cout << "end of t1" << std::endl; //coutMutex.unlock(); //iMutex.unlock(); } void th2() { std::lock_guard<std::mutex> coutlock(coutMutex); //coutMutex.lock(); std::cout << "begin of t2" << std::endl; //coutMutex.unlock(); std::lock_guard<std::mutex> iLock(iMutex); //iMutex.lock(); while (i-- >= 0) { //coutMutex.lock(); std::cout << "th2, i = " << i << std::endl; //coutMutex.unlock(); } //coutMutex.lock(); std::cout << "end of t2" << std::endl; //coutMutex.unlock(); //iMutex.unlock(); } int main() { std::thread t1(th1); std::thread t2(th2); t1.join(); t2.join(); return 0; }