在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。


以下是实现上述功能的代码示例:
微信 WeLM
WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。
33 查看详情
#include #include #include #include #includesem_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 \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】巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/483733.html
微信扫一扫
支付宝扫一扫