admin管理员组文章数量:1794759
【Linux】巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>
前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含:
一.<信号量>&<信号量互斥实验>回顾
巧妙运用< 信号量 >实现<指定顺序>的<多个线程严格轮转交替输出(互斥)>
- 传送门
二.信号量实现<控制两个线程>之间<谁先执行>
要求:
- 通过信号量初值设定,以命令行参数方式可指定哪个线程先输出数字。分别实现第0号线程和第1号线程先输出数字。程序命名为sem-syn-p.c
解析:
- 定义两个信号量,分别设置成1,0
- 我们 想让哪个进程先执行,就把哪个进程要用的信号量设置成1 ,这样 第一个进程就可以进入执行板块
- 后一个执行的进程要用的信号量设置成0,这样就会 在P(等待)操作处等待,进入阻塞
- 第一个进程V(唤醒)操作后,第一个进程信号量变为0,他也会在下一轮循环中在P(等待)操作处等待; 而此时另一个进程p的信号量由于被第一个进程信号量唤醒,变为1,进入执行板块
- 如此便实现了严格轮转(先1线程后0线程)/(先0线程后1线程)
- 实现效果
- 我们命令行输入0,表示0号线程先执行,给0号线程的信号量设置成1,给0号线程的信号量设置成0
- 我们命令行输入1,表示1号线程先执行,给1号线程的信号量设置成1,给0号线程的信号量设置成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巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>
版权声明:本文标题:【Linux】巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行> 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754618313a1704439.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论