用C语言编写一个程序,开启 3 个线程,每个线程将自己的线程号 在屏幕上打印 5 遍,要求输出结果必须按线程 1 线程 2 线程 3 的顺序显示;如:线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线程 1 线程 2 线程 3
时间: 2023-08-05 13:15:02 浏览: 178
3个线程,根据不同规则打印线程名称
以下是使用 C 语言编写的程序,通过 pthread 库实现了开启 3 个线程,并按照线程 1 线程 2 线程 3 的顺序输出结果。
```c
#include <stdio.h>
#include <pthread.h>
// 定义线程总数
#define THREAD_NUM 3
// 定义每个线程打印的次数
#define PRINT_NUM 5
// 定义线程锁和条件变量
pthread_mutex_t mutex;
pthread_cond_t cond;
// 定义全局变量,记录当前应该输出的线程编号
int current_thread_num = 1;
// 打印函数,以线程编号和打印次数作为参数
void print_func(int thread_num, int print_num) {
for (int i = 0; i < print_num; i++) {
printf("线程 %d ", thread_num);
}
}
// 线程函数,以线程编号作为参数
void* thread_func(void* arg) {
int thread_num = *(int*)arg;
// 循环打印
for (int i = 0; i < PRINT_NUM; i++) {
// 加锁
pthread_mutex_lock(&mutex);
// 判断是否是当前应该输出的线程
while (thread_num != current_thread_num) {
pthread_cond_wait(&cond, &mutex);
}
// 输出
print_func(thread_num, PRINT_NUM);
printf("\n");
// 更新当前应该输出的线程编号
current_thread_num = (current_thread_num % THREAD_NUM) + 1;
// 发送条件变量信号
pthread_cond_broadcast(&cond);
// 解锁
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
// 初始化线程锁和条件变量
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
// 创建线程
pthread_t threads[THREAD_NUM];
int thread_nums[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; i++) {
thread_nums[i] = i + 1;
pthread_create(&threads[i], NULL, thread_func, &thread_nums[i]);
}
// 等待线程结束
for (int i = 0; i < THREAD_NUM; i++) {
pthread_join(threads[i], NULL);
}
// 销毁线程锁和条件变量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
```
在上面的程序中,我们首先定义了两个常量:`THREAD_NUM` 表示线程的总数,`PRINT_NUM` 表示每个线程需要打印的次数。
然后,我们定义了一个 `print_func` 函数,用于打印线程编号。
接着,我们定义了一个 `thread_func` 函数,用于作为线程的入口函数。该函数接收一个整数参数,表示线程的编号。在函数中,我们使用一个循环来打印线程编号,每次打印前都需要加锁。在加锁后,我们使用一个 `while` 循环来判断当前是否是该线程应该输出的时候,如果不是,则使用 `pthread_cond_wait` 函数来等待条件变量的信号。一旦当前线程是应该输出的线程,我们就调用 `print_func` 函数来打印线程编号,并更新下一个应该输出的线程编号。最后,我们使用 `pthread_cond_broadcast` 函数来发送条件变量信号,解锁,并让其他线程再次判断是否该输出。
在 `main` 函数中,我们首先初始化线程锁和条件变量,然后使用 `pthread_create` 函数创建线程,并将线程编号作为参数传递给线程函数。接着,我们使用 `pthread_join` 函数等待线程结束,最后销毁线程锁和条件变量。
阅读全文