admin管理员组

文章数量:1794759

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

前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含:

在这里插入图片描述

一.<信号量>&<信号量互斥实验>回顾

巧妙运用< 信号量 >实现<指定顺序>的<多个线程严格轮转交替输出(互斥)>

  • 传送门

二.信号量实现<控制两个线程>之间<谁先执行>

要求:

  • 通过信号量初值设定,以命令行参数方式可指定哪个线程先输出数字。分别实现第0号线程和第1号线程先输出数字。程序命名为sem-syn-p.c

解析:

  1. 定义两个信号量,分别设置成1,0
  2. 我们 想让哪个进程先执行,就把哪个进程要用的信号量设置成1 ,这样 第一个进程就可以进入执行板块
  3. 后一个执行的进程要用的信号量设置成0,这样就会 在P(等待)操作处等待,进入阻塞
  4. 第一个进程V(唤醒)操作后,第一个进程信号量变为0,他也会在下一轮循环中在P(等待)操作处等待; 而此时另一个进程p的信号量由于被第一个进程信号量唤醒,变为1,进入执行板块
  5. 如此便实现了严格轮转(先1线程后0线程)/(先0线程后1线程)
  • 实现效果
  1. 我们命令行输入0,表示0号线程先执行,给0号线程的信号量设置成1,给0号线程的信号量设置成0
  2. 我们命令行输入1,表示1号线程先执行,给1号线程的信号量设置成1,给0号线程的信号量设置成0
在这里插入图片描述
代码语言:javascript代码运行次数:0运行复制
#include <semaphore.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

sem_t s1,s2;

void* runner(void* p){
      long tnum=(long)p;
      for(int i=1;i<=5;i++){
if(tnum==0)
      sem_wait(&s1);//等待(P操作)
else
      sem_wait(&s2);//等待(P操作)
      
      printf("Thread%ld:%d\n",tnum,i);
      
if(tnum==0)
      sem_post(&s2);//释放(V操作)
      sem_post(&s1);//释放(V操作)
}
     
int main(int argc,char** argv){
       pthread_t tid0,tid1;
       int num=atoi(argv[1]);
if(num==0){
//我们命令行输入0,表示0号线程先执行,给0号线程的信号量设置成1,给0号线程的信号量设置成0
       sem_init(&s0,0,1);
       sem_init(&s1,0,0);
       }
else{
//我们命令行输入1,表示1号线程先执行,给1号线程的信号量设置成1,给0号线程的信号量设置成0
       sem_init(&s1.0,1);
       sem_init(&s0.0,0);
       }
      pthread_create(&tid0,0,runner,(void*)0);
      pthread_create(&tid1,0,runner,(void*)1);
      pthread_join(tid0,0);
      pthread_join(tid1.0);

      sem_destroy(&s1);
      sem_destroy(&s2);
return 0;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-10-25,如有侵权请联系 cloudcommunity@tencent 删除linux程序进程命令行线程

本文标签: Linux巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>