1

ミューテックスを使用して 2 つのスレッドを同期するのに助けが必要です。私は C とミューテックスが初めてで、ここで何をすべきかわかりません。コードには 2 つのスレッドがあり、10 までカウントして各数値を出力しますが、同期していないため、同期して出力されず、半分同期しています。最後に問題が発生するだけであることを意味します.8..9..11、8..9..10..10などを出力することがあります。

ミューテックスに関する行を削除すると、生のコードに変更を加えることはできません。それが生のコードです。ミューテックスに関する行しか追加できません。

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

pthread_mutex_t mutex;

int g_ant = 0;

void *writeloop(void *arg) {
    while(g_ant < 10) {
        pthread_mutex_lock(&mutex);
        g_ant++;
        usleep(rand()%10);
        printf("%d\n", g_ant);
        pthread_mutex_unlock(&mutex);
    }
    exit(0);
}

int main(void)
{
    pthread_t tid;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&tid, NULL, writeloop, NULL);
    writeloop(NULL);
    pthread_join(tid, NULL);
    pthread_mutex_destroy(&mutex);
    return 0;
}
4

1 に答える 1

1

ミューテックスの外側の条件では、正しい値を受け取っていない可能性があります。ループが順番どおりに動作することを保証する方法は、次の への変更writeloopです。

void writeloop(void *arg) {
    while (g_ant < 10) {
        pthread_mutex_lock(&mutex);
        if (g_ant >= 10) {
            pthread_mutex_unlock(&mutex);
            break;
        }

        g_ant++;
        usleep(rand()%10);
        printf("%d\n", g_ant);
        pthread_mutex_unlock(&mutex);
    }
}
于 2013-02-12T19:29:39.733 に答える