【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