0

複数のスレッドの同期に問題があります。元のコードの方が大きいため、同期を「試行」するために行っていることの例のみを投稿します。基本的に、3つのスレッドが接続された重いプロセスがあり、スレッドをロック/ロック解除するために、各スレッドのミューテックス状態を変更する関数を使用します。このようなもの:

## thread.c ##
    #include "thread.h"

extern int socks;

pthread_mutex_t sem = PTHREAD_MUTEX_INITIALIZER;

void lock()
{
    pthread_mutex_lock(&sem);
}

void unlock()
{
    pthread_mutex_unlock(&sem);
}

void* thread(void* arg)
{
    printf("Socks: %d\n",socks);
    lock();
    lock();

    printf("Unlocked\n");
    return;
}


## main.c ##
#include "defines.h"
#include "thread.h"

int socks;

int main()
{
    pthread_t tid;
    socks= 9;

    pthread_create(&tid, NULL, thread, NULL);

    //sleep(2);
    unlock();
    pthread_join(tid,NULL);
}

コードを実行した後に得られるものは次のとおりです。

。/テスト

靴下:9

明らかに私はいくつかの概念が間違っていますが、問題を見つけることができません。スレッドはunlock()でロック解除されるべきではありませんか?ロック解除呼び出しの前にsleep(2)を使用すると、プログラムが機能するのはなぜですか?問題を回避するには、どちらの方法を使用すればよいですか?各コードは別々のファイルにあります。

前もって感謝します!PS:私のくだらない英語でごめんなさい!

4

1 に答える 1

0

スレッドは非同期で実行されるため、スレッドがロックに到達する前にメイン スレッドが参加する場合があります。この場合、unlock() の発生が早すぎて、動作が明確に定義されていないと思われます。ロックを解除する前にメイン スレッドをしばらくスリープ状態にすると、他のスレッドがロックをヒットする時間があるように見え、ロックを解除できるようになり、期待どおりの動作が発生します。

于 2012-06-29T01:38:57.003 に答える