linux——10线程间通讯

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:以下是本篇文章正文内容,下面案例可供参考

一、线程间通讯

1.资源竞争

线程运行的方式是异步的,对一段代码,cpu运行、一段内存都是竞争关系,谁先谁后不确定。

2.解决资源竞争问题

	采用互斥锁的来解决线程间资源竞争的问题:
	加锁
	操作共享资源
	解锁
	临界资源:同一时刻只允许被一个任务操作的资源
	临界代码、临界区:加锁和解锁中间的代码。
	用途:在线程中使用全局变量就要使用互斥锁

3.互斥锁函数接口

	   1.初始化    
       int pthread_mutex_init(pthread_mutex_t *restrict mutex,
              const pthread_mutexattr_t *restrict attr);
        功能:
        初始化互斥锁
        参数:
        	mutex:互斥锁的首地址
        	attr:互斥锁的属性(默认属性 NULL)
        返回值
        	成功返回0
        	失败返回非0
       2.销毁	      
       int pthread_mutex_destroy(pthread_mutex_t *mutex);
        功能:
        	销毁互斥锁
        参数:
        	mutex:互斥锁的首地址
        返回值
			成功返回0
			失败返回非0
		3.加锁
	   int pthread_mutex_lock(pthread_mutex_t *mutex);
	   功能:
        	加互斥锁
        参数:
        	mutex:互斥锁的首地址
        返回值
			成功返回0
			失败返回非0
		4.解锁	
       int pthread_mutex_unlock(pthread_mutex_t *mutex);
       功能:
        	解互斥锁
        参数:
        	mutex:互斥锁的首地址
        返回值
			成功返回0
			失败返回非0
					原子操作:
			不被cpu打断的一次操作
		

4.死锁条件

		死锁:
			多个线程在通讯时,由于加锁导致多个线程任务无法同时继续向下执行而产生的状态,成为死锁。
		成为死锁的条件:
		1.互斥条件
			锁资源只能同时被一个任务使用
		2.不可剥夺条件
			锁资源被一个任务使用不能被其余任务剥夺
		3.请求保持条件
			自身占据资源的情况下,申请获得新资源
		4.循环等待条件
			多个任务申请组成环形,导致无法获得资源,而一致等待资源
		死锁如果解决:
		1.注意加锁顺序
		2.使用pthread_mutex_trylock实现枷锁
		3.打破互斥或者不可剥夺条件(不建议使用)
		

二、同步

概念:在某一时刻让任务有时间关系

1.信号量

信号量是一种资源,可以申请(资源数-1)可以释放(资源数+1)
PV操作:实现任务的同步

2.函数接口

	同步:
	多任务使用信号量实现任务同步
	信号量:是一种资源
	信号量可以被申请可以被申请(-1)释放(+1)
	pv操作:
	P:申请资源
	V:释放资源:
	1初始化信号量:
	int sem_init(sem_t *sem, int pshared, unsigned int value);
	功能:
		初始化信号量
	参数:
		sem:信号量空间首地址
		pshared:
		0   线程间共享
		非0 进程间共享
		value:信号量初值
	返回值:
		成功返回0
		失败返回-1
	2.销毁一个信号量
	int sem_destroy(sem_t *sem);
	功能:
		销毁一个信号量
	参数:
		sem:信号量空间首地址
	返回值:
		成功返回0;
		失败返回-1
	3.int sem_wait(sem_t *sem);
	功能:
		申请资源
	参数:
		sem:信号量首地址
	返回值:
		成功返回值0;
		失败返回-1
	
	4.int sem_post(sem_t *sem);
	功能:
		释放资源
	参数:
		sem:信号量首地址
	返回值:
		成功返回值0;
		失败返回-1

总结

提示:这里对文章进行总结:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值