欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 【Linux】巧妙运用<信号量>控制<n个线程>之间<按指定顺序轮转>(思维导图&代码演示&思路解析)

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

2025/2/24 22:07:58 来源:https://blog.csdn.net/YYDsis/article/details/143311528  浏览:    关键词:【Linux】巧妙运用<信号量>控制<n个线程>之间<按指定顺序轮转>(思维导图&代码演示&思路解析)

前言

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

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《初学者易错点》专栏
  • YY的《小小知识点》专栏
  • YY的《单片机期末速过》专栏
  • YY的《C++期末速过》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏
  • YY的《数据库原理》专栏

目录

  • 一.回顾:使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)
  • 二.回顾:巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>
  • 三.<信号量>实现<控制n线程>之间<按什么顺序轮转>

一.回顾:使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出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=0sem_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;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词