2

今日、pthread コードを書きました。

#include <pthread.h>
#include <stdio.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *thread1(void *arg)
{
    while (1) {
        pthread_mutex_lock(&mutex);
        sleep(1);
        printf("thread1...\n");
        pthread_mutex_unlock(&mutex);
    }
}

void *thread2(void *arg)
{
    while (1) {
        pthread_mutex_lock(&mutex);
        sleep(1);
        printf("thread2...\n");
        pthread_mutex_unlock(&mutex);
    }
}

int main()
{
    pthread_t tid1, tid2;
    pthread_create(&tid1, NULL, thread1, NULL);
    pthread_create(&tid2, NULL, thread2, NULL);

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    return 0;
}

次のように実行されると思います。

thread1...
thread2...
thread1...
thread2...

しかし、実際には実行されます:

thread1...
thread1...
thread1...
thread1...

thread2 は実行されていないようです。したがって、このコードを 1 時間以上実行すると、thread2 は 1 行だけを出力します。インターレースで実行しないのはなぜですか?

私の環境:

  • Ubuntu 10.04 x86_64
  • Linux ubuntu 2.6.32-36-generic #79-Ubuntu SMP Tue Nov 8 22:29:53 UTC 2011 x86_64 GNU/Linux
  • CPU:Intel Core i7 930 (4コア、8スレッド)

ありがとうございました。

4

1 に答える 1

2

スリープをミューテックス ロックの外に移動して、オペレーティング システムのプロセス スケジューリング アルゴリズムが解放され、他のスレッドを調べられるようにします。問題は、スリープ時に他のスレッドがスケジュールされる可能性がありますが、ロックが設定されているため、スケジュールされないことです。スレッド 1 が起動すると、ロックが解除されますが、すぐにループバックして設定されます。スレッド 2 が入る機会はほとんどありません。

于 2013-01-04T16:01:18.060 に答える