pthreads信号量,为什么这不能正常执行?

pthreads信号量,为什么这不能正常执行?,第1张

概述这是我正在进行的任务.它必须使用信号量,而不是互斥量. #include <stdio.h> #include <pthread.h> #include <assert.h> #include <unistd.h> #include <semaphore.h> #include <fcntl.h>sem_t *ab, *ac, *ad, *de, *ce, *bf, *ef; vo 这是我正在进行的任务.它必须使用信号量,而不是互斥量.

#include <stdio.h> #include <pthread.h> #include <assert.h> #include <unistd.h> #include <semaphore.h> #include <fcntl.h>sem_t *ab,*ac,*ad,*de,*ce,*bf,*ef; voID *a(voID *arg) {    printf("Entering A...\n");    sleep(1);    printf("Exiting A...\n");    assert(sem_post(ab)==0);    assert(sem_post(ac)==0);    assert(sem_post(ad)==0);    pthread_exit((voID *)99);}voID *b(voID *arg) {    assert(sem_wait(ab)==0);    printf("Entering B...\n");    sleep(1);    printf("Exiting B...\n");    assert(sem_post(bf)==0);    pthread_exit((voID *)99);}voID *c(voID *arg) {    assert(sem_wait(ac)==0);    printf("Entering C...\n");    sleep(1);    printf("Exiting C...\n");    assert(sem_post(ce)==0);    pthread_exit((voID *)99);}voID *d(voID *arg) {    assert(sem_wait(ad)==0);    printf("Entering D...\n");    sleep(1);    printf("Exiting D...\n");    assert(sem_post(de)==0);    pthread_exit((voID *)99);}voID *e(voID *arg) {    assert(sem_wait(ce)==0);    assert(sem_wait(de)==0);    printf("Entering E...\n");    sleep(1);    printf("Exiting E...\n");    assert(sem_post(ef)==0);    pthread_exit((voID *)99);}voID *f(voID *arg) {    assert(sem_wait(bf)==0);    assert(sem_wait(ef)==0);    printf("Entering F...\n");    sleep(1);    printf("Exiting F...\n");    pthread_exit((voID *)99);}int main() {     pthread_t _a,_b,_c,_d,_e,_f;    int r1,r2,r3,r4,r5,r6;    ab=sem_open("foobar",O_CREAT,0700,0);    ac=sem_open("foobar",0);    ad=sem_open("foobar",0);    ce=sem_open("foobar",0);    de=sem_open("foobar",0);    ef=sem_open("foobar",0);    bf=sem_open("foobar",0);    /*sem_init(ab,1);    sem_init(ac,1);    sem_init(ad,1);    sem_init(ce,1);    sem_init(de,1);    sem_init(ef,1);    sem_init(bf,1);*/    assert(pthread_create(&_a,NulL,a,&r1) == 0);    assert(pthread_create(&_b,b,&r2) == 0);    assert(pthread_create(&_c,c,&r3) == 0);    assert(pthread_create(&_d,d,&r4) == 0);    assert(pthread_create(&_e,e,&r5) == 0);    assert(pthread_create(&_f,f,&r6) == 0);    assert(pthread_join(_a,NulL) == 0);    assert(pthread_join(_b,NulL) == 0);    assert(pthread_join(_c,NulL) == 0);        assert(pthread_join(_d,NulL) == 0);    assert(pthread_join(_e,NulL) == 0);    assert(pthread_join(_f,NulL) == 0);    assert( sem_close(ab)==0 );     assert( sem_close(ac)==0 );     assert( sem_close(ad)==0 );     assert( sem_close(ce)==0 );    assert( sem_close(de)==0 );     assert( sem_close(bf)==0 );    assert( sem_close(ef)==0 );     return 0; }

这很简单,但由于某种原因,它没有以正确的顺序执行.输出远非一致但总是不正确.这是一个示例输出:

进入A ……
输入B …< ---- sem_post(ab)甚至还没有被调用
退出A …
进入C ……
进入D ……
退出B …
退出D …
退出C …
进入E ……
输入F …
退出F …
退出E …

它应该遵循以下图表:

任何有关这方面的帮助将不胜感激,但这是一项任务,所以不要开始告诉我以完全不同的方式做到这一点并且不要直接给出答案,只需指出正确的方向.

解决方法 在您的代码A中,在使用ab打印出口线之前未锁定.

这意味着当它从睡眠状态返回时,它可以做任何想做的事情,因为它不依赖于锁或其他任何东西.

您应该使用信号量来阻止其他线程/函数继续. sleep()只是放弃处理器指定的时间量,之后它们可以继续.

注意:

你可能不必使用睡眠.如果线程无法获得锁定,线程将放弃cpu

总结

以上是内存溢出为你收集整理的pthreads信号量,为什么这不能正常执行?全部内容,希望文章能够帮你解决pthreads信号量,为什么这不能正常执行?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1229472.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存