【Linux】巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>
发布时间 - 2025-06-25 00:00:00 点击率:次在linux系统中,我们可以巧妙地利用信号量来控制两个线程之间的执行顺序。通过设置信号量的初始值,并通过命令行参数指定哪个线程先输出数字,我们可以实现第0号线程或第1号线程优先执行的效果。程序命名为sem-syn-p.c。
我们定义两个信号量,分别设置为1和0。想要哪个线程先执行,就将该线程所需的信号量初始值设为1。这样,第一个线程就可以进入执行区块。而后执行的线程所需的信号量初始值设为0,它会在P(等待)操作处阻塞,直到第一个线程通过V(唤醒)操作将其信号量值设为1。
这种方法实现了严格的轮转执行顺序:如果我们命令行输入0,表示0号线程先执行,那么我们将0号线程的信号量设置为1,1号线程的信号量设置为0。反之,如果输入1,表示1号线程先执行,则将1号线程的信号量设置为1,0号线程的信号量设置为0。
以下是实现上述功能的代码示例:
#include#include #include #include #include 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); printf("Thread %ld: %d\n", tnum, i); sem_post(&s2); } else { sem_wait(&s2); printf("Thread %ld: %d\n", tnum, i); sem_post(&s1); } } return NULL; }
int main(int argc, char* argv[]) { pthread_t tid1, tid2; long t1 = 0, t2 = 1;
if (argc != 2) { fprintf(stderr, "Usage: %s zuojiankuohaophpcn0|1youjiankuohaophpcn\n", argv[0]); exit(1); } int first = atoi(argv[1]); if (first == 0) { sem_init(&s1, 0, 1); sem_init(&s2, 0, 0); } else if (first == 1) { sem_init(&s1, 0, 0); sem_init(&s2, 0, 1); } else { fprintf(stderr, "Invalid argument. Use 0 or 1.\n"); exit(1); } pthread_create(&tid1, NULL, runner, (void*)t1); pthread_create(&tid2, NULL, runner, (void*)t2); pthread_join(tid1, NULL); pthread_join(tid2, NULL); sem_destroy(&s1); sem_destroy(&s2); return 0;}
通过上述代码,我们实现了根据命令行参数控制两个线程执行顺序的功能。
# linux # ai # 命令行参数 # 线程 # 信号量 # 设置为 # 设为 # 命令行 # 第一个 # 所需 # 实现了 # 会在 # 将其 # 我们可以
相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571 】
相关推荐: Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案 Laravel distinct去重查询_Laravel Eloquent去重方法 如何在阿里云购买域名并搭建网站? 高性能网站服务器配置指南:安全稳定与高效建站核心方案 如何在自有机房高效搭建专业网站? Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】 原生JS实现图片轮播切换效果 Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程 如何在香港免费服务器上快速搭建网站? ,南京靠谱的征婚网站? 如何快速搭建自助建站会员专属系统? 如何破解联通资金短缺导致的基站建设难题? 微信公众帐号开发教程之图文消息全攻略 Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】 JS碰撞运动实现方法详解 如何在宝塔面板中修改默认建站目录? Swift开发中switch语句值绑定模式 如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体 免费视频制作网站,更新又快又好的免费电影网站? Laravel如何使用Eloquent进行子查询 在线制作视频的网站有哪些,电脑如何制作视频短片? 如何续费美橙建站之星域名及服务? 网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规? Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】 魔方云NAT建站如何实现端口转发? Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件 Python并发异常传播_错误处理解析【教程】 Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程 学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站? 百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭 个人摄影网站制作流程,摄影爱好者都去什么网站? 三星、SK海力士获美批准:可向中国出口芯片制造设备 Laravel怎么清理缓存_Laravel optimize clear命令详解 Win11关机界面怎么改_Win11自定义关机画面设置【工具】 如何在橙子建站上传落地页?操作指南详解 黑客如何通过漏洞一步步攻陷网站服务器? 企业网站制作这些问题要关注 如何在景安云服务器上绑定域名并配置虚拟主机? CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】 Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】 使用豆包 AI 辅助进行简单网页 HTML 结构设计 宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法 宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程 Python正则表达式进阶教程_复杂匹配与分组替换解析 教你用AI润色文章,让你的文字表达更专业 网站制作企业,网站的banner和导航栏是指什么? JS中对数组元素进行增删改移的方法总结 HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】 Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】 Swift中循环语句中的转移语句 break 和 continue
下一篇:C中Clear方法的作用解析
下一篇:C中Clear方法的作用解析


{
long tnum = (long)p;
for (int i = 1; i <= 5; i++) {
if (tnum == 0) {
sem_wait(&s1);
printf("Thread %ld: %d\n", tnum, i);
sem_post(&s2);
} else {
sem_wait(&s2);
printf("Thread %ld: %d\n", tnum, i);
sem_post(&s1);
}
}
return NULL;
}