-1

私はCでプログラムを書いていて、A、B、Cの3つの関数があります。これらの関数へのアクセスをロックしているグローバルとして静的ミューテックスがあります。関数 A、B、C はマルチスレッドから任意の順序で呼び出されるため、私のコードは次のようになります。

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int A() {
    pthread_mutex_lock(&mutex);
    ... do some processing...
    pthread_mutex_unlock(&mutex);
    return anInt;
}

int B() {
    pthread_mutex_lock(&mutex);
    ... do some processing...
    pthread_mutex_unlock(&mutex);
    return anInt;
}

int C() {
    pthread_mutex_lock(&mutex);
    ... do some processing...
    pthread_mutex_unlock(&mutex);
    return anInt;
}

デッドロックの原因は何ですか?

4

1 に答える 1

2

あなたのコードはきれいです。

メモリ違反などのまれなケースをスキップすると、デッドロックが発生する可能性が 2 つあります。

  1. これらの関数のいずれかの「ロックされた」部分から A()、B() または C() のいずれかを呼び出す。

  2. pthread_mutex_unlock() を使用せずに、これらの関数のいずれかの「ロックされた」部分から戻る。

どちらの場合も、同じミューテックスで pthread_mutex_lock() が二重に呼び出されるため、デッドロックが発生します。

私の英語が下手ならごめんなさい:)

于 2013-05-13T13:22:22.470 に答える