当前位置:网站首页>互斥量解决线程同步问题
互斥量解决线程同步问题
2022-07-30 05:39:00 【l_ethan】
目录
1.互斥量简介
简介:使用互斥量来确保同时仅有一个线程可以访问某项共享资源。
互斥量的两种状态:已锁定(locked)和未锁定(unlocked)
一旦线程锁定互斥量,随即成为该互斥量的所有者,只有所有者才能给互斥量解锁。
特殊情形:死锁
当超过一个线程加锁同一组互斥量,就有可能发生死锁
死锁的几种场景
1.忘记释放锁
2.重复加锁
3.多线程多锁,抢占锁资源

2.互斥量的函数原型
互斥量的类型 pthread_mutex_t
pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
-功能:初始化互斥量
- 参数 :
- mutex : 需要初始化的互斥量变量
- attr : 互斥量相关的属性,NULL
- restrict : C语言的修饰符,被修饰的指针,不能由另外的一个指针进行操作。
pthread_mutex_t *restrict mutex = xxx;
pthread_mutex_t * mutex1 = mutex
pthread_mutex_destroy
int pthread_mutex_destroy(pthread_mutex_t *mutex);-功能:释放互斥量的资源
pthread_mutex_lock
int pthread_mutex_lock(pthread_mutex_t *mutex);-功能:加锁,阻塞的,如果有一个线程加锁了,那么其他的线程只能阻塞等待
pthread_mutex_trylock
int pthread_mutex_trylock(pthread_mutex_t *mutex);-功能:尝试加锁,如果加锁失败,不会阻塞,会直接返回
pthread_mutex_unlock
int pthread_mutex_unlock(pthread_mutex_t *mutex);-功能:解锁
3.案例源码
三个线程对票这个共享资源进行操作
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
//全局变量,所有的线程都共享这一份资源
int tickets=1000;
//创建一个互斥量
pthread_mutex_t mutex;
void *sellticket(void *arg){
while(1){
//加锁
pthread_mutex_lock(&mutex);
if(tickets>0){
usleep(60000);
printf("%ld 正在卖第 %d 张门票\n",pthread_self(),tickets);
tickets--;
}else{
//解锁
pthread_mutex_unlock(&mutex);
break;
}
//解锁
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main(){
//初始化互斥量
pthread_mutex_init(&mutex,NULL);
//创建3个子线程
pthread_t tid1,tid2,tid3;
pthread_create(&tid1,NULL,sellticket,NULL);
pthread_create(&tid2,NULL,sellticket,NULL);
pthread_create(&tid3,NULL,sellticket,NULL);
//回收子线程的资源,阻塞函数
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
//退出主线程
pthread_exit(NULL);
//回收互斥量资源
pthread_mutex_destroy(&mutex);
return 0;
}边栏推荐
- MySql模糊查询大全
- CISP-PTE真题演示
- 应用实践 | Apache Doris 在百度智能云计费账单系统的应用实践
- “tensorflow.keras.preprocessing“ has no attribute “image_dataset_from_directory“
- Ranking of grades (Huazhong University of Science and Technology postgraduate examination questions) (DAY 87)
- flask使用token认证
- numpy中np.inf函数的用法讲解
- 【图像处理】基于中轴变换实现图像骨架提取附matlab代码
- MySQL (2)
- 海量号码需要保存,如何才能尽可能少地占用内存?
猜你喜欢
随机推荐
MySql的初识感悟,以及sql语句中的DDL和DML和DQL的基本语法
131.分割回文串
MySQL user authorization
MySQL Soul 16 Questions, how many questions can you last?
enumerate() 函数
【飞控开发基础教程9】疯壳·开源编队无人机-PWM(电机控制)
[Mysql] CONVERT函数
坠落的蚂蚁(北京大学考研机试题)
idea 编译protobuf 文件的设置使用
453.最小操作数使数组元素相等
646.最长数对链(动态规划)
51.N皇后(回溯法)
HCIP-第九天-BGP(边界网关协议)
mysql time field is set to current time by default
【Koltin Flow(一)】五种创建flow的方式
MySql模糊查询大全
面试前需要巩固的算法知识点(自用,更新中)
倒计数(来源:Google Kickstart2020 Round C Problem A)(DAY 88)
Navicat connection MySQL error: 1045 - Access denied for user 'root'@'localhost' (using password YES)
爬虫数据是如何收集和整理的?









