pthread_mutex_trylock
私は構造体にmutexをロックするために、与えられた時間に1つのスレッドでしかアクセス/変更できないようにします。ミューテックスがすでにロックされている場合は、キューイング/ブロッキングではなくルーチンから戻るだけです。同時に2つのスレッドによって呼び出されたときに `pthread_mutex_trylock`ブロックが発生する
これは私のコードの基本的なアウトラインです:時々2つのスレッドが両方のコール同時にルーチンを呼び出すときに、しかし
myStruct* struc = malloc(sizeof(struc));
setupStruct(struc);
:構造体は、このように一度初期化される
typedef struct {
pthread_mutex_t m;
} myStruct;
void setupStruct(myStruct* struc) {
pthread_mutex_init(&struc->m, NULL);
}
void structOp(myStruct* struc) {
printf("structOp(): Trying to lock\n");
if(pthread_mutex_trylock(&struc->m) != 0) {
printf("structOp(): Lock failed\n");
return;
} else {
printf("structOp(): Locked\n");
// do some stuff to struct
pthread_mutex_unlock(&struc->m);
}
}
〜trylock
がブロックされているようです。これは、両方のスレッドで同時に "ロックしようとしています"が表示されますが、ミューテックスがロックされているかどうかにかかわらず印刷されないためです。私はもともとpthread_mutex_lock
でこの問題を抱えていたので、この理由でノンブロッキング版を試しましたが、ブロックされているようです。
これは必ずしも発生するとは限りませんが、それが実行されたときには常に最初の2つのルーチンが呼び出されます。最初の2つの呼び出しが正常に実行された場合、後続の呼び出しも正常に動作します。
ブロックする理由はありますか?私はちょうど間違っていくつかの他の問題のためにこのブロックを認識していますか?問題が他の場所にある場合は、コードの他の部分を投稿することができます。
は私の知る限り、ブロックするには、このための理由はありません。他の場所で何かが間違っている可能性があります。 – Mat
setupStruct()は何を呼び出していますか?それは何度も何回も呼ばれていませんか? –
新しいスレッドが開始される直前に一度だけ呼び出されます。私は問題がある場合は、私のポインタを使うのがもっともらしいと思います。これらは正しいようですか?私は 'myStruct * struc = malloc(sizeof(struc)); 'で構造体を割り当てています。この情報で質問を更新します。 – Matt