2

以下のプログラムでは、ランダムなインスタンスでセグメンテーション違反 (コア ダンプ)エラーが発生します。エラーなしで実行される場合もあります。このプログラムは、デッドロックを理解するためのものです。

このプログラムを約 15 回実行しましたが、これまでデッドロックに直面したことはありません。プログラムがスムーズに実行される場合もあれば (これは予想されることです)、セグメンテーション違反が発生する場合もあります (これは予想外です)。セグメンテーション違反が発生するのはなぜですか?

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

int a=5;
int b=3;

pthread_mutex_t mutex1,mutex2;


void* add_subtract(){

    pthread_mutex_lock(&mutex1);
    pthread_mutex_lock(&mutex2);
    a=a+2;
    b=b-2;
    printf("%d %d\n",a,b);
    pthread_mutex_unlock(&mutex2);
    pthread_mutex_unlock(&mutex1);



}


void* subtract_add(){


    pthread_mutex_lock(&mutex2);
    pthread_mutex_lock(&mutex1);
    b=b-2;
    a=a+2;
    printf("%d %d\n",a,b);

    pthread_mutex_unlock(&mutex1);
    pthread_mutex_unlock(&mutex2);

}
int main(){

    pthread_t thread1,thread2;
    pthread_create(&thread1,NULL,add_subtract(),NULL);
    pthread_create(&thread2,NULL,subtract_add(),NULL);
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    return 0;

}

4

2 に答える 2

2

add_subtract()引数として渡す場合、関数を呼び出してから、戻り値を引数として渡します。この場合、関数自体を渡したい...括弧なしで試してください。

于 2013-05-24T04:29:14.980 に答える
1

ミューテックスを初期化する必要があると思います: http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_init.html

pthread_mutex_init() 関数は、attr で指定された属性を使用して、mutex によって参照されるミューテックスを初期化します。attr が NULL の場合、デフォルトのミューテックス属性が使用されます。その効果は、デフォルトのミューテックス属性オブジェクトのアドレスを渡すのと同じです。初期化が成功すると、ミューテックスの状態は初期化され、ロック解除されます。

于 2013-05-24T04:28:13.400 に答える