2

セマフォは静的変数として定義されています

static int semaphore = -1;

このセマフォに投稿しようとしています

sem_post(&semaphore);

この方法で作成されたスレッドには、セマフォの待機があります。

pthread_create(&tid, NULL, start, NULL);

static void *start(void *context)
{
    // ...

    sem_init(&semaphore, 0, 0);    
    sem_wait(&semaphore);

    // ...

    return NULL;
}

どういうわけか、セマフォの待機はセマフォの投稿の影響を受けません。開始ルーチンからセマフォに投稿すると、すべて問題ありません。

何が問題ですか?

4

1 に答える 1

4

関数の最初のパラメーターとしてではint*なく渡すと、割り当てられた領域を超えてメモリにアクセスする可能性があります。の少なくとも 1 つのソースによると、 のサイズは 16 ~ 32 バイトです。セマフォの構造を保持するのに十分ではなく、未定義の動作が発生する可能性があります。sem_t*sem_xxx<semaphore.h>sem_tint

変更する必要があります

static int semaphore = -1;

static sem_t semaphore;

割り当てられたメモリ領域を超えるアクセスを修正します。

また、セマフォを使用するスレッドを開始する前に、セマフォを初期化することをお勧めします。初期化呼び出しをstart()関数からmain()、またはスレッドの開始に使用する関数に移動する必要があります。

sem_init(&semaphore, 0, 0);
于 2013-04-22T16:45:00.677 に答える