-1

嘿伙计们,我最近开始了,我不太擅长使用信号量。我想要做的是让一个进程显示一个数字(例如 1),另一个进程显示 2,然后切换回第一个进程显示 3,然后切换回第二个进程显示 4,依此类推....目前我能够显示 1 然后 2 然后 3 但不幸的是它回到 1 而不是显示 4.How do I让它显示 4 。请帮忙 :)

//critical.c
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>

#include "se_sems.h"

int main(int argc, char argv[])
{
    const int ONE_DONE = 0;
    const int TWO_DONE = 1;
    volatile int flag = ONE_DONE;


    //Use our source file as the "key"
    int id = se_semget("critical.c",1);

    int pid = fork();
    if (pid) {
        //P1
        while(1) {
            flag = ONE_DONE;

            se_wait(id);
            printf("2222222222 \n");
            printf("22222222222 \n");
            fflush(stdout);
            se_signal(id);

            flag = TWO_DONE;
            do {
                sleep(1);
            } while (flag == ONE_DONE);
            printf("444444444444 \n");
            printf("44444444444 \n");

            se_signal(id);
        }
    } else {
        //P2
        while (1) {
            flag = TWO_DONE;
            se_wait(id);
            printf("1111111 \n");
            printf("1111111 \n");
            fflush(stdout);
            se_signal(id);

            flag = ONE_DONE;
            do {
               sleep(1);
            } while (flag == TWO_DONE);
            printf("33333333 \n");
            printf("3333333333 \n");
            se_signal(id);
        }
    }
}

输出

1111111
1111111
2222222222
22222222222
33333333
3333333333
1111111
1111111
444444444444
44444444444
2222222222
22222222222
33333333
3333333333
1111111
1111111
444444444444
44444444444

等等 :)

4

1 回答 1

0

我发现最简单的方法是将最后一个显示留空,因此它看起来好像按顺序显示。所以不,你不需要2个信号量。

于 2015-03-11T14:29:51.667 回答