5

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

これがブロックされる理由はありますか?他の問題が原因で、このブロックを誤って認識しているだけですか? 問題が他の場所にある可能性がある場合は、コードの他の部分を投稿できます。

4

2 に答える 2

8

この行は間違っています:

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

十分なメモリが割り当てられないため、ミューテックスにアクセスするメモリを破棄/再利用している可能性があります。を使用するとsizeof(struc)、 の型にメモリが割り当てられ、strucの型strucは amyStruct*であるため、ポインタを保持するのに十分なメモリのみが割り当てられます (つまり、4 または 8 バイト)。

やったほうがいい

    myStruct* struc = malloc(sizeof *struc); 

また

    myStruct* struc = malloc(sizeof(myStruct)); 
于 2012-04-21T11:00:49.073 に答える
0

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

OS が valgrind をサポートしている場合は、memcheck モジュールと helgrind モジュールを使用してアプリを確認ください

于 2012-04-21T10:40:43.857 に答える