目录
一、什么是互斥锁
保证线程安全的一种锁机制,在同一时刻,只允许一个执行流去访问临界资源。
二、为什么需要互斥锁
由于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;
}
程序运行结果:

说明:在这个程序当中,临界资源就是标准输出,对标准输出加锁。
本文详细介绍了互斥锁的概念、作用、工作原理,以及如何在C++中使用互斥锁来保证线程安全,防止共享资源访问冲突。通过具体的使用例子,展示了互斥锁在解决多线程并发问题中的应用。
2605

被折叠的 条评论
为什么被折叠?



