线程间的同步与互斥

本文探讨了线程间的同步与互斥,解释了临界资源和临界区的概念,以及互斥如何保证资源访问的安全。介绍了互斥锁mutex的创建、初始化、锁定和解锁操作,并讨论了静态和动态分配的锁的区别。此外,还讲解了条件变量cond的使用场景,指出条件等待需要互斥量的原因,以确保线程安全地访问和修改共享数据。

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

进程线程中的互斥需要

临界资源:多线程共享的资源流就是临界资源

临界区:每个线程内部,访问临界资源的代码,就叫做临界区

互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用

原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成

互斥锁mutex

大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量

但有时候,线程使用的数据都是局部变量,变量的地址空间在线程栈内部,这种情况,变量归属单个线程,其他线程无法获得这种变量

但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程间的交互

多线程并发的操作共享变量,会带来一些问题

mutex的使用

pthread_mutex_create mutex;创建一个名为mutex的互斥锁

pthread_mutex_init(&mutex, NULL);对mutex这个互斥锁进行初始化

pthread_mutex_lock(&mutex)/ pthread_mutex_unlock(&mutex) 对mutex这把锁进行加锁和解锁操作

pthread_mutex_destroy(&mutex) 销毁这把锁

注意,创建锁时有两种方法,一种是动态分配

其格式为 pthread_mutex_create mutex = PTHREAD_,MUTEX_CREATE

这种静态分配的锁不需要销毁

而且这种锁,即时创建多个,他们的地址虽然会相同,但是仍然不是同一把锁

平时我们使用的pthread_mutex_create mutex;属于动态分配,这种锁在使用完之后需要进行销毁

条件变量cond

当一个线程互斥地访问某个变量时,它可能发现在其他线程改变状态之前,他什么也做不了

例如一个线程访问队列时,发现队列为空,它只能等待,知道另一个线程将节点加入到队列中,这种情况就需要用到条件变量

同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步

竞态条件:因为时序问题,而导致程序异常,我们称之为竞态条件

cond的使用

pthread_cond_create cond;创建一个名为cond的条件变量

pthread_cond_init(&cond, NULL);对mutex这个条件变量进行初始化

pthread_cond_wait(&cond,&mutex)/ pthread_cond_signal(&cond) 对cond这个条件变量进行等待和唤醒操作

pthread_cond_destroy(&cond) 销毁这个条件变量

 

为什么pthread_cond_wait需要互斥量

条件等待是线程间同步的一种手段,如果只有一个线程,条件不满足,一直等下去都不会满足,所以必须有一个线程通过某些操作,改变共享变量,使原先不满足的条件变得满足,并且友好的通知等待在条件变量上的线程

条件不会无缘无故的突然变满足了,必然会牵扯到共享数据的变化。所以一定要用互斥锁来保护。没有互斥锁就无法安全的获取和修改共享数据

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值