进程线程中的互斥需要
临界资源:多线程共享的资源流就是临界资源
临界区:每个线程内部,访问临界资源的代码,就叫做临界区
互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用
原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成
互斥锁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需要互斥量
条件等待是线程间同步的一种手段,如果只有一个线程,条件不满足,一直等下去都不会满足,所以必须有一个线程通过某些操作,改变共享变量,使原先不满足的条件变得满足,并且友好的通知等待在条件变量上的线程
条件不会无缘无故的突然变满足了,必然会牵扯到共享数据的变化。所以一定要用互斥锁来保护。没有互斥锁就无法安全的获取和修改共享数据