线程同步
进程/线程同步:竞争关系 协作关系
1 | int pthread_exit(void *result); |
互斥量(互斥锁)
锁:加锁,解锁
线程在进入临界区之前,加锁操作(如果锁是加锁状态的,则执行加锁操作将被阻塞)。线程在退出临界区之后,解锁状态。
1 | 互斥锁类型:pthread_mutex_t 一般将锁定义到全局 |
example:
主线程负责接收用户输入,函数线程负责将用户输入打印到终端界面。
数据传递:主线程到函数线程–>全局空间
主线程和函数线程需要同步:
1 |
|
信号量–线程库中的信号量
特殊的一个计数器
信号量类型:全局 sem_t类型
1 | 初始化:int sem_init(sem_t *sem,int shared,int val); |
example:完成上面互斥锁那个操作,使用两个信号量。
1 |
|
条件变量
1、mutex加锁
2、wait调用,将线程放到cond现成列表中,然后解锁
3、wait返回时,mutex又会被锁住
4、对mutex解锁
传递给pthread_cond_wait的互斥量对条件进行保护,调用者把锁住的互斥量传给函数。函数把调用线程放在等待条件的线程列表上,然后对互斥量解锁,这两个操作是原子操作。这样就关闭了条件检查和线程进入休眠状态等待条件改变这两个操作之间的时间通道,这样线程就不会错过条件的任何变化。pthread_cond_wait返回时,互斥量再次被锁住。
1 |
|
读写锁:
读加锁:允许多个线程同时进行读加锁(所有线程都只是执行读操作),在互斥锁的基础上做一些扩充,可以允许多个线程以读的操作方式去占据锁,使得线程执行有更高的并行性。