先上一张程序员喜欢的格子衫图片。
![6b921b017dd64b47b1213742a11d41f8.png](https://i-blog.csdnimg.cn/blog_migrate/dd89125ef817a3be32c6043a43178015.jpeg)
利用"二进制信号量"(0和1)完成"控制线程顺序"为中心的同步方法。
#include int sem_init(sem_t *sem, int pshared, unsigned value);int sem_destory(sem_t *sem);创建及销毁的方法#include int sem_post(sem_t *sem);int sem_wait(sem_t *sem);
调用 sem_init 函数时,操作系统将创建信息量对象,对象记录着“信号量值”整数。
调用 sem_post函数时信号量值增1, 调用sem_wait函数时信号量值减1。
当信号量为0时调用sem_wait函数时,调用线程将进入阻塞状态。
等到其他线程调用sem_post函数信号量将变为1后,当前阻塞线程会跳出阻塞状态。
通过这样的操作完成临界点的操作。
sem_init(&sem_one, 0, 0);sem_init(&sem_two, 0, 1);// 线程1 函数void t1 () {sem_wait(&sem2); // 信号量0 阻塞后执行t2函数,t2执行完信号量等于1,开始执行t1函数//临界开始....//临界结束sem_post(&sem1); //信号量1 跳出阻塞}void t2(){//线程2sem_wait(&sem1); // 信号量0 阻塞//临界开始....//信号量1 跳出阻塞}//临界结束sem_post(&sem2);
当执行完t1函数后sem1信号量等于0,sem2信号量等于1。
t1函数在sem_wait开始阻塞,会先执行 t2函数。
执行完t2函数 sem2的信号量等于0, sem1的信息号等于1 t2开始阻塞。
等待t1执行后, sem1信号量+1后跳出阻塞。
如此实现两个线程交替执行。