私はミューテックスがif文でロックまたはロック解除された場合に確認する必要があります...チェック
if(mutex[id] != 2){
/* do stuff */
}
が、私はそれをチェックしたときにgccが私に次のエラーを与える:
error: invalid operands to binary != (have 'ptherad_mutex_t' and 'int')
それでは、どのように私は、mutexがロックされているかされていないかどうかを確認することができますか?
EDIT:
私の問題への重要な要素は、(設計上)私のスレッドが右別のスレッドに制御を渡した後に自分自身をロックしていることです。したがって、スレッドAがスレッドBに制御を渡すと、スレッドAがロックされ、スレッドBが何らかの処理を行い、スレッドBが完了するとスレッドAのロックが解除されます。
スレッドBがスレッドAのロックを解除しようとするとスレッドAがまだロックを完了していない場合、ロック解除の呼び出しは失われ、スレッドAはロックされたままであり、デッドロックが発生します。
UPDATE:
私はカフェの提案を取ったが、私はまだ問題に実行しています私のプログラムをリメイク。私は自分のプログラムを構造カフにモールドして最高の状態で提供していますが、今はデッドロックを引き起こしていることを伝えることさえできません...私は新しい質問hereを作成しました。
以下は、カフェの提案の実行可能なバージョンです。私はスレッドaの関数で小さな並べ替えを行いました。スレッドaとスレッドbの両方が作成時にロックされず、決して変更できない状態を待っていました。
#include <pthread.h>
int run_a = 0;
pthread_mutex_t lock_a = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_a = PTHREAD_COND_INITIALIZER;
int run_b = 0;
pthread_mutex_t lock_b = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_b = PTHREAD_COND_INITIALIZER;
void *a(void *);
void *b(void *);
int main(){
int status;
pthread_t thread_a;
pthread_t thread_b;
pthread_create(&thread_a, NULL, a, (void *)0);
pthread_create(&thread_b, NULL, b, (void *)0);
pthread_join(thread_a, (void **)&status);
pthread_join(thread_b, (void **)&status);
}
/* thread A */
void *a(void *i){
while (1) {
printf("thread A is running\n");
sleep(1);
/* unlock thread B */
pthread_mutex_lock(&lock_b);
run_b = 1;
pthread_cond_signal(&cond_b);
pthread_mutex_unlock(&lock_b);
/* wait for thread A to be runnable */
pthread_mutex_lock(&lock_a);
while (!run_a)
pthread_cond_wait(&cond_a, &lock_a);
run_a = 0;
pthread_mutex_unlock(&lock_a);
}
}
/* thread B */
void *b(void *i){
while (1) {
/* wait for thread B to be runnable */
pthread_mutex_lock(&lock_b);
while (!run_b)
pthread_cond_wait(&cond_b, &lock_b);
run_b = 0;
pthread_mutex_unlock(&lock_b);
printf("thread B is running\n");
sleep(1);
/* unlock thread A */
pthread_mutex_lock(&lock_a);
run_a = 1;
pthread_cond_signal(&cond_a);
pthread_mutex_unlock(&lock_a);
}
}
mutexesはロックされたスレッドによってロック解除されなければなりません。あるスレッドによってロックされ、別のスレッドによってロック解除されるロック構造が必要な場合は、セマフォを使用する必要があります(または上の例のように独自のセマフォを構築する必要があります)。あるスレッドがmutxをロックし、別のスレッドがロックを解除すると、本当に醜い同期バグが発生する可能性があります。 –