技术咨询:信号量控制的代码中指定位置同时运行的线程数
关于信号量控制下的并发线程数问题
嘿,这个问题其实很好理解,咱们结合你给的代码和信号量的工作逻辑来拆解:
首先看你的代码(注意你注释掉了sem_init(&sem,0,10);,但你提到最大数量是10,所以默认这个初始化是生效的):
sem_t semt; void* function(void* arg){ // sem_init(&sem,0,10); sem_wait(&sem); -----here sem_post(&sem); }
这里用的是计数信号量,初始值设为10,它的作用就像一个“许可证池”:
sem_wait(&sem)相当于从池子里拿一张许可证,只有拿到许可证的线程才能继续往下执行;如果池子里没许可证了(信号量值为0),线程就会阻塞等待,直到有其他线程归还许可证。sem_post(&sem)则是把用过的许可证放回池子里。
那在-----here这个位置,同一时刻最多能有多少线程在运行呢?答案就是10个:
- 当第1个线程调用
sem_wait,信号量值从10变成9,线程顺利进入-----here; - 第2个线程调用
sem_wait,信号量值变成8,也进入代码段; - ……
- 直到第10个线程调用
sem_wait,信号量值变成0,这个线程也能进入-----here; - 这时候如果有第11个线程调用
sem_wait,因为信号量值已经是0了,它会被阻塞在sem_wait这一步,根本到不了-----here的位置。
只有当某个在-----here的线程执行完sem_post,把许可证放回池子里(信号量值变回1),才会有下一个等待的线程拿到许可证,进入代码段。所以同一时刻,最多只会有10个线程处于-----here的运行状态。
内容的提问来源于stack exchange,提问作者user9718094
相关产品推荐
相关产品推荐

