1、课程目标
- 同步机制(了解)
- 信号量(理解)
- P操作(熟练)
- V操作(熟练)
- 小结
2、线程间通信
- 线程共享同一进程的地址空间
- 优先:线程间通信简便
- 1、通过全局变量交换数据(有读取有写入)
- 缺点:多个线程访问共享数据时需要同步或互斥机制,否则会造成资源抢占。
3、线程通信-同步
- 同步(synchronization,通常缩写syn)指的是多个任务按照约定的先后次序相互配合完成一键事情
- 1968年、Edsgr Dijkstra基于信号量的概念提出一种同步机制
- 有信号量来决定线程是继续运行或者阻塞等待
4、信号量(灯)
- 信号量代表某一类资源,其值代表系统中该类型的数量(非负数的整数-sem信号量的值)
- 信号量是一个受保护的变量,只能通过三种操作访问
- 1、初始化
- 2、P操作(申请操作,每次操作sem-1)
- 3、V操作(释放资源,每次操作sem+1)
5、信号量-P/V操作
if(信号量的值>0)
{
申请资源任务继续运行;
信号量的值-1;
}
else
{
申请资源的任务阻塞;
}
信号量的值-1;
if(有任务在等待资源)
{
唤醒等待任务继续运行;
}
6、Posix-信号量
- Posix中定义了两类信号量;
- 1、无名信号量(基于内存的信号量,主要用于进程内部线程之间,进程之间也行但复杂)
- 2、有名信号量(既可以线程之间也可以进行之间)
- pthread库常用的信号量操作函数如下:
- 1、int sem_init(sem_t *sem, int pshared, unsigned int value);
- 2、int sem_wait(sem_t *sem);//P操作
- 3、int sem_post(sem_t *sem);//V操作
信号量初始化-sem_init
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
- 成功返回0,失败EOF;
- sem指向要初始化的信号量对象
- pthread 0代表线程间使用,1代表进程间使用
- val信号量的初值,0代表当前没有资源,大于0代表有资源
信号量-P/V操作函数
#include <semaphore.h>
int sem_wait(sem_t *sem);//P操作
int sem_post(sem_t *sem);//V操作
- 成功返回0,失败EOF;
- sem指向要初始化的信号量对象
线程同步小结
- 同步的概念和机制
- 信号量概念
- PV操作(P操作可能会堵塞,V操作不会产生堵塞)