2

コードのセマフォに問題があります。

これは私が作成した構造体です:

struct PipeShm
{
        // doesn't matter 
        sem_t *mutex;
        int init;
        // more fields
};

ここで、構造体を初期化します。

struct PipeShm myPipe ;
myPipe.mutex = NULL;
myPipe.init = 0;

そして、私は初期化メソッドを使用します:

int initMethod()
{
    if (!myPipe.init)
    {
        myPipe.mutex = mmap (NULL, sizeof *myPipe.mutex, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);
        if (!sem_init (myPipe.mutex, 1, 0))
        {
            myPipe.init = TRUE;
        }
        else
            perror ("initMethod");
    }
    return 1;   
}

これは、上記を使用する単純なメインです:

int main()

{
    int spd, pid, rb;
    char buff[4096];


    shm_pipe_init();
    fork();

        // more code goes here 

        return 0;
}

行の中でfork();(私が間違っている場合は私を訂正してください)、2プロセスには2つの異なるセマフォがありますよね?

もしそうなら、私はグローバルセマフォを作りたいです。それは可能ですか?

私のコードの同期の問題のため、主な理由は、作成された各プロセスの二重セマフォであると思われます。

4

1 に答える 1

2

セマフォを初期化するコードは正しいように見えるため、同期の問題について他の場所を探す必要があります。以下は、コードの動作を示すテストプログラムです。

void do_child () {
    fprintf(stderr, "[%u] child: waiting...\n", (unsigned)time(0));
    sem_wait(myPipe.mutex);
    fprintf(stderr, "[%u] child: sleeping 1...\n", (unsigned)time(0));
    sleep(1);
    fprintf(stderr, "[%u] child: posting...\n", (unsigned)time(0));
    sem_post(myPipe.mutex);
    fprintf(stderr, "[%u] child: done...\n", (unsigned)time(0));
}

void do_parent (pid_t p) {
    fprintf(stderr, "[%u] parent: sleeping 5...\n", (unsigned)time(0));
    sleep(5);
    fprintf(stderr, "[%u] parent: posting...\n", (unsigned)time(0));
    sem_post(myPipe.mutex);
    fprintf(stderr, "[%u] parent: waiting...\n", (unsigned)time(0));
    sem_wait(myPipe.mutex);
    fprintf(stderr, "[%u] parent: waitpid...\n", (unsigned)time(0));
    waitpid(p, 0, 0);
    fprintf(stderr, "[%u] parent: done...\n", (unsigned)time(0));
}

int main () {
    pid_t p;
    myPipe.mutex = NULL;
    myPipe.init = 0;
    initMethod();
    switch ((p = fork())) {
    case 0:  do_child(); break;
    case -1: perror("fork"); break;
    default: do_parent(p); break;
    }
    return 0;
}

すでにご存知だと思いますが、念のため、セマフォは実際にはミューテックスではありません。ミューテックスは、post値がに初期化されるセマフォと考えることができます1。ただし、セマフォは複数の同時投稿を防ぐことはできません。セマフォへの偽の投稿がある場合、これにより、複数のスレッドがクリティカルセクションに入ることができます。

于 2012-07-30T19:04:25.960 に答える