Linuxマルチスレッド-3つのサブスレッドが交互に実行されます
迅雷筆記試験問題:
プログラムを作成し、3つのスレッドを開き、この3つのスレッドのIDはそれぞれA、B、Cであり、各スレッドは自分のIDを画面に10回印刷し、出力結果はABCの順序で表示しなければならない.如:ABCABC....順番に押す.
プログラム:
プログラムを作成し、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;
}