pthread_mutex_trylock
特定の時間に単一のスレッドのみがアクセス/変更できるように、構造体のミューテックスをロックするために使用しています。ミューテックスが既にロックされている場合は、キューイング/ブロックするのではなく、ルーチンから戻ります。
これは私のコードの基本的な概要です:
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);
}
}
構造体は、次のように一度初期化されます。
myStruct* struc = malloc(sizeof(struc));
setupStruct(struc);
ただし、2 つのスレッドが同時にルーチンを呼び出すと、両方の呼び出しがtrylock
ブロックされているように見えることがあります。両方のスレッドに対して同時に「ロックしようとしています」と表示されますが、ミューテックスがロックされているかどうかは表示されないため、これを想定しています。私はもともとこの問題を抱えていたpthread_mutex_lock
ので、この理由で非ブロック バージョンを試しましたが、それでもブロックしているようです。
これは常に発生するわけではありませんが、発生する場合は常に、ルーチンへの最初の 2 つの呼び出しです。最初の 2 つの呼び出しが正常に実行された場合、後続の呼び出しも正常に機能します。
これがブロックされる理由はありますか?他の問題が原因で、このブロックを誤って認識しているだけですか? 問題が他の場所にある可能性がある場合は、コードの他の部分を投稿できます。