信号量的基本思想是通过一个计数器和一组相关的操作来实现资源的控制和同步。计数器表示可用的资源数量,每次访问共享资源时,线程需要先申请信号量,如果信号量的计数器大于零,则线程可以访问共享资源并将计数器减一;如果计数器为零,则线程需要等待,直到其他线程释放资源,使计数器变为非零。
信号量和线程锁Mutex有很多相似之处,也有些不同点:
①Mutex只能是0和1,0表示上锁,1表示释放锁。但是semaphore可以大于1。
②信号量可以用于线程间,也可以用于进程间通信。但是Mutex只能用于线程间通信。
主要有以下几个函数:
int sem_init (sem_t *sem, int pshared, unsigned int value);//初始化信号量
int sem_wait(sem_t *sem); //阻塞等,等不到就一直阻塞着等
int sem_trywait(sem_t *sem); //非阻塞等
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); //定时等
生产者消费者模型如下:
创建个仓库,里面有5个空位,可以放0-5件商品。
如果放满了没人来取商品,就是爆仓;
如果取货时没货,就是崩盘。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include