Linuxマルチスレッド-3つのサブスレッドが交互に実行されます


迅雷筆記試験問題:
プログラムを作成し、3つのスレッドを開き、この3つのスレッドのIDはそれぞれA、B、Cであり、各スレッドは自分のIDを画面に10回印刷し、出力結果はABCの順序で表示しなければならない.如:ABCABC....順番に押す.
プログラム:
#include <pthread.h>
#include <cstdio>

const int THREAD_NUMBER = 3;

//             
pthread_mutex_t thread_mutex[THREAD_NUMBER];
pthread_cond_t thread_cond[THREAD_NUMBER];

//          
bool thread_wait_flag[THREAD_NUMBER];

//             ID
pthread_mutex_t mutex;
int thread_turn;

void *thread_func(void *arg);

int main(int argc, char **argv)
{
    pthread_t tids[THREAD_NUMBER];

    for (int i = 0; i < THREAD_NUMBER; ++i)
    {
        pthread_mutex_init(&thread_mutex[i], NULL);
        pthread_cond_init(&thread_cond[i], NULL);
    }
    
    pthread_mutex_init(&mutex, NULL);
    thread_turn = 0;
    
    for (int i = 0; i < THREAD_NUMBER; ++i)
        thread_wait_flag[i] = false;
    
    for (int i = 0; i < THREAD_NUMBER; ++i)
    {
        pthread_create(&tids[i], NULL, thread_func, (void *)i);
    }

    for (int i = 0; i < THREAD_NUMBER; ++i)
    {
        pthread_join(tids[i], NULL);
    }
    printf("
"); return 0; } void *thread_func(void *arg) { int id = (int)arg; char ch = 'A' + id; int count = 0; while (true) { if (id == thread_turn) // , ID, { printf("%c", ch); ++count; if (id == THREAD_NUMBER-1 && count == 10) // 3 , ID , 。 break; pthread_mutex_lock(&mutex); ++thread_turn; thread_turn %= THREAD_NUMBER; pthread_mutex_unlock(&mutex); while (true) { pthread_mutex_lock(&thread_mutex[thread_turn]); if (true == thread_wait_flag[thread_turn]) { pthread_cond_signal(&thread_cond[thread_turn]); pthread_mutex_unlock(&thread_mutex[thread_turn]); break; } pthread_mutex_unlock(&thread_mutex[thread_turn]); } if (count == 10) // 1、2 , , break; } else // , { pthread_mutex_lock(&thread_mutex[id]); thread_wait_flag[id] = true; pthread_cond_wait(&thread_cond[id], &thread_mutex[id]); thread_wait_flag[id] = false; pthread_mutex_unlock(&thread_mutex[id]); } } return (void *)0; }