加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:25:55 所属栏目:百科 来源:网络整理
导读:这是我正在进行的任务.它必须使用信号量,而不是互斥量. #include stdio.h #include pthread.h #include assert.h #include unistd.h #include semaphore.h #include fcntl.hsem_t *ab,*ac,*ad,*de,*ce,*bf,*ef; void *a(void *arg) { printf("Entering A...
这是我正在进行的任务.它必须使用信号量,而不是互斥量.

#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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读