2012-04-21 20 views
5

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つの呼び出しが正常に実行された場合、後続の呼び出しも正常に動作します。

ブロックする理由はありますか?私はちょうど間違っていくつかの他の問題のためにこのブロックを認識していますか?問題が他の場所にある場合は、コードの他の部分を投稿することができます。

+1

は私の知る限り、ブロックするには、このための理由はありません。他の場所で何かが間違っている可能性があります。 – Mat

+1

setupStruct()は何を呼び出していますか?それは何度も何回も呼ばれていませんか? –

+0

新しいスレッドが開始される直前に一度だけ呼び出されます。私は問題がある場合は、私のポインタを使うのがもっともらしいと思います。これらは正しいようですか?私は 'myStruct * struc = malloc(sizeof(struc)); 'で構造体を割り当てています。この情報で質問を更新します。 – Matt

答えて

8

この行は間違っている:

myStruct* struc = malloc(sizeof(struc)); 

あなたはおそらくあなたがミューテックスにアクセスするメモリを再利用/中傷しているので、それは、十分なメモリをalloateしません。 sizeof(struc)を使用すると、strucの種類にメモリを割り当て、そしてstrucのタイプはmyStruct*なので、あなただけのあなたが何をすべき

ポインタ(ielikelyわずか4または8バイト)を保持するのに十分なメモリを割り当てている

myStruct* struc = malloc(sizeof *struc); 

または

myStruct* struc = malloc(sizeof(myStruct)); 
+0

うわー、私は長い間、間違って私の構造体を割り当ててきました..説明してくれてありがとう! – Matt

0

これは、タイミング問題またはメモリ破損のようなものです。いずれにしても、投稿したコードとは関係ないので、この質問に答える方法はありません。

ご使用のOSがvalgrindをサポートしている場合は、memcheckhelgrindモジュールでアプリをチェックしてください。

関連する問題