用c语言编写一个可产生两个线程(一个输出AAAAAA,一个输出BBBBBB)的程序,代码中要求控制线程的输出为AAAAAABBBBBB的顺序。然后修改控制代码,重新编译执行,得到另一种输出顺序,得到BBBBBBAAAAAA的输出
时间: 2024-02-01 08:13:14 浏览: 72
线程顺序输出的问题
以下是产生AAAAAA和BBBBBB的线程的代码,使用C语言的POSIX线程库编写:
```c
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
void* print_a(void* arg){
pthread_mutex_lock(&mutex);
for(int i = 0; i < 6; i++){
printf("A");
fflush(stdout);
pthread_cond_signal(&cond);
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void* print_b(void* arg){
pthread_mutex_lock(&mutex);
for(int i = 0; i < 6; i++){
printf("B");
fflush(stdout);
pthread_cond_signal(&cond);
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main(){
pthread_t thread_a, thread_b;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
// 第一种输出顺序:AAAAAABBBBBB
pthread_create(&thread_a, NULL, print_a, NULL);
pthread_create(&thread_b, NULL, print_b, NULL);
pthread_cond_signal(&cond);
pthread_join(thread_a, NULL);
pthread_join(thread_b, NULL);
printf("\n");
// 第二种输出顺序:BBBBBBAAAAAA
pthread_create(&thread_a, NULL, print_a, NULL);
pthread_create(&thread_b, NULL, print_b, NULL);
pthread_cond_signal(&cond);
pthread_join(thread_b, NULL);
pthread_join(thread_a, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
```
这个程序使用了一个互斥锁(mutex)和一个条件变量(cond),通过控制条件变量来实现线程的同步。在主线程中,首先创建两个线程分别用于输出A和B,然后发送一次信号通知线程开始执行,最后等待两个线程结束后再销毁互斥锁和条件变量。第一次执行时输出AAAAAABBBBBB,第二次执行时输出BBBBBBAAAAAA。
阅读全文