第六课:C++多线程共享锁(互斥锁)

文章介绍了C++中两种线程同步机制:mutex和lock_guard。mutex需要手动锁定和解锁,而lock_guard通过构造和析构自动完成锁定与解锁操作,降低了死锁的风险。示例代码展示了如何在多线程环境下使用这两个工具确保数据的安全访问。
摘要由CSDN通过智能技术生成

一、mutex 

mutex 需要手动
1、mutex 类(互斥量):创建mutex类的对像
1.1,通过调用lock函数进行加锁  (在读就不能写,在写就不能读)
1.2,通过调用unlock进行解锁
注意点:lock必须与unlock成对出现

如下:

 void makeFriend()
    {
        
        for (int i = 0; i < 1000; i++)
        {

            m_mutex.lock();     //手动加锁
            printf("谈女朋友\n");
            mm.push_back(i);
            m_mutex.unlock();   //手动解锁
        }
    }

    void breakUp()
    {

        for (int i = 0; i < 1000; i++)
        {
            if (!mm.empty())
            {
                
                m_mutex.lock();    //手动加锁
                printf("和女朋友分手%d\n", mm.back());
                mm.pop_back();
                m_mutex.unlock();   //手动解锁
            }
            else
            {
                printf("海王变单身狗\n");
            }
        }
    }

二、lock_guard

lock_guard 自动
1,lock_guard 对像实现加锁
1.1,在locK_guard类的构造函数中用lock函数
1.2,lock_gurad类的折构函数调用了unloc函数

如下:

 void makeFriend()
    {
        lock_guard<mutex> lgObject(m_mutex); //自动加锁和解锁

        for (int i = 0; i < 1000; i++)
        {

            printf("谈女朋友\n");
            mm.push_back(i);
        }
    }

    void breakUp()
    {

        lock_guard<mutex> lgObject(m_mutex); //自动加锁和解锁

        for (int i = 0; i < 1000; i++)
        {
            if (!mm.empty())
            {
                
                printf("和女朋友分手%d\n", mm.back());
                mm.pop_back();
            }
            else
            {
                printf("海王变单身狗\n");
            }
        }
    }

三、完整案例

#include<thread>
#include<iostream>
#include<list>
#include<string>
#include<cstdio>
#include<mutex>

using namespace std;
using namespace this_thread;

class SeaKing
{
public:
    void makeFriend()
    {
        lock_guard<mutex> lgObject(m_mutex); //自动加锁和解锁

        for (int i = 0; i < 1000; i++)
        {

            //m_mutex.lock();     //手动加锁
            printf("谈女朋友\n");
            mm.push_back(i);
           // m_mutex.unlock();   //手动解锁
        }
    }

    void breakUp()
    {

        lock_guard<mutex> lgObject(m_mutex); //自动加锁和解锁

        for (int i = 0; i < 1000; i++)
        {
            if (!mm.empty())
            {
                
                //m_mutex.lock();    //手动加锁
                printf("和女朋友分手%d\n", mm.back());
                mm.pop_back();
                //m_mutex.unlock();   //手动解锁
            }
            else
            {
                printf("海王变单身狗\n");
            }
        }
    }
protected:
    list<int> mm;
    mutex m_mutex;   //互斥量
};

int main()
{
    SeaKing mm;
    thread t1(&SeaKing::makeFriend, &mm);
    thread t2(&SeaKing::breakUp, &mm);

    t1.join();
    t2.join();
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值