1

問題のコードは次のとおりです。

void insertIntoFinalArray(char * string) {
    sem_wait(&insert);
    if (finalarray == NULL) finalarray = (char **) malloc(sizeof(char *));
    else finalarray = (char **) realloc(finalarray, ((size_final + 1) * sizeof(char *)));

    finalarray[size_final] = (char *) malloc(sizeof(string) + 1);
    strcpy(finalarray[size_final], string);
    size_final++;
    sem_post(&insert);
}

insert はsem_init(&insert, 0, 0);EDIT として初期化されます: これは、sem_init(&insert, 0, 1)私がコードをかき混ぜていて、元に戻さなかったと思われます...どちらの方法でも機能しません。

私が理解しているように、スレッドは値がゼロより大きくなるまで sem_wait() で待機する必要があります。ただし、デバッグでは関数内に複数のスレッドが表示されます。うぐぐ

セマフォが何をするのか理解していないだけですか?

編集:OS Xは名前のないセマフォをサポートしていません...ただし、使用してもinsert = sem_open("insert", O_CREAT, 1);、すべてのスレッドがsem_wait()行を通過できます。

4

1 に答える 1

0

助けてくれたダックに感謝します。

Apple gcc は semaphores.h で sem_init を定義しますが、-1 を返します - これは実装されていません。つまり、名前のないセマフォを持つことはできません。代わりに、sem_open(name, options, initial value);

于 2013-10-11T01:15:18.550 に答える