【Linux】巧妙运用<信号量>控制<n个线程>之间<按指定顺序轮转>(思维导图&代码演示&思路解析)

前言

大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴Linux专栏!更多干货持续更新!以下是信号量相关博客传送门!

一.回顾:使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)

使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)

二.回顾:巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>

巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>

三.<信号量>实现<控制n线程>之间<按什么顺序轮转>

要求:

  • 有三个线程,通过信号量初值设定,可线程按照顺序输出数字。分别实现第2号线程和第1号线程和第0号线程先输出数字。

解析:

  1. 定义三个信号量,s1 设置成1,s2=s3设置成0;
  2. 我们想让哪个进程先执行,就把哪个进程要用的信号量设置成1 ,这样第一个进程就可以进入执行板块(后一个执行/不执行)的进程要用的信号量设置成0,这样就会在P(等待)操作处等待,进入阻塞
  3. 第一个进程V(唤醒)操作后,第一个进程信号量变为0,他也会在下一轮循环中在P(等待)操作处等待; 而此时第二个进程p的信号量由于被第一个进程信号量唤醒,变为1,进入执行板块——如此便实现了严格轮转(先1线程后2线程)
  4. 此时我们再 设置第二个线程要唤醒(V操作)谁,便可控制<控制n线程>之间<按什么顺序>轮转 。我们让第二个线程,唤醒s3,线程3的信号量s3变为1,进入执行板块

流程图演示:
在这里插入图片描述

#include <semaphore.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

sem_t s1,s2,s3;

void* runner(void* p){
      long tnum=(long)p;
      for(int i=1;i<=5;i++){
if(tnum==0)
      sem_wait(&s1);//等待(P操作)
else if(tnum=1)
      sem_wait(&s2);//等待(P操作)
else(tnum=2)
      sem_wait(&s3);//等待(P操作)
      
      printf("Thread%ld:%d\n",tnum,i);
      
if(tnum==0)
      sem_post(&s2);//释放(V操作)
else if(tnum=1)
      sem_post(&s3);//释放(V操作)
else(tnum=2)
      sem_post(&s1);//释放(V操作)
}
     
int main(){
       pthread_t tid0,tid1,tid2;
//s1设置成1,s2=s3=0
       sem_init(&s0,0,1);
       sem_init(&s1,0,0);
       sem_init(&s2,0,0);
       }

      pthread_create(&tid0,0,runner,(void*)0);
      pthread_create(&tid1,0,runner,(void*)1);
      pthread_create(&tid2,0,runner,(void*)2);
      
      pthread_join(tid0,0);
      pthread_join(tid1.0);
      pthread_join(tid2,0);

      sem_destroy(&s1);
      sem_destroy(&s2);
      sem_destroy(&s3);
return 0;


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YY的秘密代码小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值