线程的互斥与同步

本文介绍了线程的互斥与同步概念,互斥保证资源唯一访问性,同步则关注时序访问性。同步互斥用于解决多任务竞争和依赖问题。互斥通过互斥量实现,强调无序访问;同步包含条件变量和POSIX信号量等方法,确保有序执行。文中还提供了相关接口示例及读写锁的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是互斥?什么是同步?

互斥:一个资源一次只能被一个访问者使用(保证访问数据,唯一访问性)

举个例子:你去上厕所,门一开,人进去,门锁上,在你上厕所期间别人不能打扰

同步:当多个访问者一起工作时并对每个访问者访问的时序有一定限制(保证访问数据,时序访问性)

举个例子:你上完厕所,刚出来,本来应该由别人了,但是你此时又进去,你反复的进去出来,导致别人都上不了厕所。因此同步就是保证时序性的,你出来了,应该去后面排队。

为什么要同步与互斥?

1.在运行多个任务,都需要访问同一种资源-----------竞争

2.多个任务之间有依赖关系,某个任务的运行状态依赖于另一个任务

同步互斥就是解决这类问题的。

互斥和同步的联系?

同步是一种更为复杂的互斥,而互斥是一种特殊的同步。

也就是说互斥是两个任务之间不可以同时运行,他们会互相排斥,必须等待一个执行完再执行,而同步也是不能同时运行,但是必须要按照某种次序来运行。但是互斥不限制任务的执行顺序。(互斥任务是无序的,同步任务是有序的)

线程如何实现互斥

互斥量 :是一个可以处于两态之一的变量,解锁和加锁。用来保护临界资源的。当你访问临界资源的时候,先要申请锁,如果别人还没释放你就被阻塞,如果没人用你就可以加锁,这样就很有效的保证临界资源一段时间内只能被一个人访问。

互斥量接口如下:

互斥量使用注意事项:

 1.初始化互斥量(程序起始)

2.加锁操作(进入临界区之前)

3.解锁操作(出临界区之后)注意:你加锁了,在有可能退出的地方都要解锁,否则会出现死锁问题

4.销毁互斥量(程序结束前)

下面看一个例子,购票ticket--,不是一个原子操作,有可能在sleep的时候被切出去,造成错误判断的问题,因此进入临界区的时候要进行加锁。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
int ticket = 100;
pthread_mutex_t mutex;
void * get_ticket(void *arg)
{
	int id = (int)arg;
	while (1)
	{
		pthread_mutex_lock(&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值