3-2-1

发布时间 2023-11-14 16:38:19作者: Ann-

为全局变量 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;
}