
linux编程实现三个线程ABC,并让它们顺次打印自己的ID,使用信号量
发布日期:2021-05-15 09:23:38
浏览次数:19
分类:精选文章
本文共 1562 字,大约阅读时间需要 5 分钟。
#include#include #include #include #include #include static sem_t sem1, sem2, sem3; int global = 0; #define MAX 15 void *t1_exe(void *arg) { while (global < MAX) { printf("Thread 1: %d\n", global); sleep(1); global++; } } void *t2_exe(void *arg) { while (global < MAX) { printf("Thread 2: %d\n", global); sleep(1); global++; } } void *t3_exe(void *arg) { while (global < MAX) { printf("Thread 3: %d\n", global); sleep(1); global++; } } int main() { int i; pthread_t tid; sem_init(&sem1, NULL, 1); sem_init(&sem2, NULL, 1); sem_init(&sem3, NULL, 1); for (i = 0; i < MAX; i++) { sleep(1); printf("Main process: %d\n", i); if (i % 3 == 0) { printf("Creating thread %d\n", i); if (pthread_create(&tid, NULL, &t1_exe)) { printf("Error creating thread: %d\n", errno); return -1; } } else if (i % 2 == 0) { printf("Creating thread %d\n", i); if (pthread_create(&tid, NULL, &t2_exe)) { printf("Error creating thread: %d\n", errno); return -1; } } else { printf("Creating thread %d\n", i); if (pthread_create(&tid, NULL, &t3_exe)) { printf("Error creating thread: %d\n", errno); return -1; } } } sleep(15); printf("All threads created and running...\n"); return 0; }
以上代码展示了一个使用多线程技术和信号量管理的C语言程序。程序中定义了三个线程函数t1_exe
、t2_exe
和t3_exe
,这些线程函数负责在global
变量从1到15之间递增的过程中,分别输出不同的日志信息。主程序中使用信号量sem1
、sem2
和sem3
进行线程同步,确保每个线程能够按照顺序执行。通过sem_init
初始化信号量,sem_wait
等待信号量释放,sem_post
发送信号量给其他线程。程序通过pthread_create
创建线程并使用errno
处理错误信息。
程序的设计目标是模拟一个多线程环境下的信号量管理场景,展示信号量在避免竞态条件和保证线程有序执行中的应用。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月28日 16时32分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ubuntu16.04下系统配置
2019-03-12
国内有哪些比较靠谱的云服务器?
2019-03-12
Java中有几种基本数据类型?它们分别占多大字节?
2019-03-12
Java中基本类型的转换规则
2019-03-12
Mapper 接口方法如何与注解里的 SQL 进行绑定的?
2019-03-12
python安装和配置(win10)
2019-03-12
重构函数(1)条件合并
2019-03-12
2020编码大赛(1)题目
2019-03-12
BitChanger语言
2019-03-12
Pythagorea(3)第16-21章
2019-03-12
纪念碑谷(1-5章)
2019-03-12
基数树(radix tree)
2019-03-12
58Q游戏(4)73(5)85(6)98(7)
2019-03-12
独立钻石棋详解
2019-03-12
106 多米诺骨牌(12)119(8)130(9)142(10)150(11)
2019-03-12
点亮细胞171-180
2019-03-12
C++ Primer Plus读书笔记:c++字符串
2019-03-12
CSU 1757: 火车入站(区间覆盖的最大覆盖深度)
2019-03-12
C++ Primer Plus读书笔记:循环读取(错误处理)
2019-03-12