多线程(二)互斥锁详解

本文详细介绍了互斥锁的概念、作用、工作原理,以及如何在C++中使用互斥锁来保证线程安全,防止共享资源访问冲突。通过具体的使用例子,展示了互斥锁在解决多线程并发问题中的应用。

目录

一、什么是互斥锁

二、为什么需要互斥锁

三、互斥锁的原理

四、互斥锁的相关接口

五、互斥锁的使用举例


一、什么是互斥锁

保证线程安全的一种锁机制,在同一时刻,只允许一个执行流去访问临界资源。

二、为什么需要互斥锁

由于CPU进行程序处理的时候并不会一次性将一个程序执行完毕,而是执行一个时间片之后会切换另外一个程序,这种方式也称位CPU的分时机制。正因为这种机制不能保证每一次的执行流都是原子操作,会导致程序出现二义性;互斥锁就是为了解决当多个执行流去访问共享资源的时候出现的二义性问题。

三、互斥锁的原理

本质上可以认为是一个计数器,在互斥锁的内部有一个计数器,实际上就是一个互斥量;计数器的取值只能是0或1,当一个线程去获取临界资源的时候,首先去获取互斥锁,当计数器的值为1的时候,表示当前的锁资源可以获取,当获取成功之后计数器的值就变成0,也就可以对临界资源进行访问修改;当计数器的值为0的时候,表示当前的锁资源不可以获取,就是没有获取到互斥锁,也就不可以访问临界资源,执行流就行阻塞等待。

 

四、互斥锁的相关接口

//初始化互斥锁
int pthread_mutex_init(pthread_mutex_t* mutex,pthread_mutexattr_t* attr)
//pthread_mutex_t* mutex 互斥锁变量类型
//pthread_mutexattr_t* attr 互斥锁属性, 一般传递NULL

//销毁互斥锁
pthread_mutex_destroy(pthread_mutex_t* mutex)
//加锁
int pthread_mutex_lock(pthread_mutex_t* mutex)
//mutex:传入互斥锁变量的地址

int pthread_mutex_trylock(pthread_mutex_t* mutex)
//该接口是非阻塞加锁接口,一般需要搭配循环来使用

int pthread_mutex_timedlock(pthread_mutex_t* mutex, const struct timespec* abs_timeout)
//带有超时时间的加锁接口

//解锁
int pthread_mutex_unlock(pthread_mutex_t* mutex)

五、互斥锁的使用举例

    #include<iostream>
    #include<unistd.h>
    #include<pthread.h>
    using namespace std;
    pthread_mutex_t mut;
    void* startPthread(void* arg)
    {
       while(1)
       {
        pthread_mutex_lock(&mut);
        cout<<"hello word I am work pthread"<<endl;
        pthread_mutex_unlock(&mut);
        sleep(1);
      }
    }
    int main()
    {                                                                                                                                                    
      pthread_mutex_init(&mut, NULL);
      pthread_t pd;
      pthread_create(&pd, NULL, startPthread,NULL);
      while(1)
      {
        pthread_mutex_lock(&mut);
        cout<<"hello word I am main pthread"<<endl;
        pthread_mutex_unlock(&mut);
        sleep(1);
      }
      pthread_mutex_destroy(&mut);
      return 0;
    }

程序运行结果:

 说明:在这个程序当中,临界资源就是标准输出,对标准输出加锁。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小明学编程~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值