1

私のコードで何が問題になったのか誰か教えてください。一度に 1 つのスレッドだけが重要な領域にアクセスできるようにしたいのですが、すべてのスレッドが入ります。

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

pthread_t th[5];
pthread_mutex_t mutex_for_some_value;
int value;

void * thread_talk(void * arguments) {

    while (1) {

        pthread_mutex_lock(&mutex_for_some_value);

        printf("\n Now Accessed by %d", *((int*) arguments));

        pthread_mutex_unlock(&mutex_for_some_value);
        sleep(2);

        printf("\n\n Thread %d is left critical section", *((int*) arguments));
    }

    return NULL;
}

int main(int argc, char **argv) {

    int count[5] = { 1, 2, 3, 4, 5 };

    printf("\n %d", pthread_mutex_init(&mutex_for_some_value, NULL));

    for (int i = 0; i < 5; i++) {
        printf("\n Creating %d thread", count[i]);
        pthread_create(&th[i], NULL, &thread_talk, (void*) &count[i]);
    }

    for (int i = 0; i < 5; ++i) {
        pthread_join(th[i], NULL);
    }

    pthread_mutex_destroy(&mutex_for_some_value);

    printf("\n Main done");

    return 0;
}

ミューテックスが存在するため、2 つのスレッドがクリティカル リージョンに入る必要はありません。しかし、出力は

0 スレッドを 1 つ作成

2 スレッドの作成

3 スレッドの作成

4 スレッドの作成

5 スレッドの作成

現在 4 人がアクセス

現在 3 人がアクセス

現在2人がアクセス中

現在 1 人がアクセス

現在 5 人がアクセス

スレッド 4 はクリティカル セクションのままであり、現在 4 によってアクセスされています

スレッド 3 はクリティカル セクションのままで、現在 3 によってアクセスされています

スレッド 1 はクリティカル セクションのままです。現在 1 によってアクセスされています

スレッド 2 はクリティカル セクションのままで、現在 2 によってアクセスされています

スレッド 5 は左クリティカル セクションです

4

1 に答える 1

2

この線:

sleep(2)

別のスレッドが「Now Accessed by Y」を出力するまで、「Thread X is left critical section」出力を遅らせます。ロックはまだ機能しているはずです。

于 2013-10-11T07:35:50.537 に答える