Linux开启 3 个线程,每个线程将自己的线程号 在屏幕上打印 5 遍,要求输出结果必须按线程 1 线程 2 线程 3 的顺序显示;如:线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线
时间: 2023-08-05 20:46:32 浏览: 120
好的,这是一个经典的线程同步问题,可以通过使用互斥锁或条件变量来解决。下面是一个使用互斥锁的C语言代码示例:
```
#include <stdio.h>
#include <pthread.h>
#define THREAD_NUM 3
#define PRINT_TIMES 5
pthread_mutex_t mutex;
int cur_thread = 1;
void *print_thread_id(void *arg) {
int thread_id = *(int*)arg;
int i;
for (i = 0; i < PRINT_TIMES; ++i) {
pthread_mutex_lock(&mutex);
while (thread_id != cur_thread) {
pthread_mutex_unlock(&mutex);
sched_yield();
pthread_mutex_lock(&mutex);
}
printf("线程 %d ", thread_id);
cur_thread = (cur_thread % THREAD_NUM) + 1;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t threads[THREAD_NUM];
int thread_ids[THREAD_NUM] = {1, 2, 3};
int i;
pthread_mutex_init(&mutex, NULL);
for (i = 0; i < THREAD_NUM; ++i) {
pthread_create(&threads[i], NULL, print_thread_id, (void*)&thread_ids[i]);
}
for (i = 0; i < THREAD_NUM; ++i) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
return 0;
}
```
在这个代码中,我们首先定义了线程数量和每个线程需要打印的次数。然后定义了一个全局的互斥锁和当前应该打印的线程号。在每个线程的执行函数中,线程首先根据自己的线程ID,进入一个循环中。在循环中,线程首先尝试获取互斥锁,然后检查当前应该打印的线程号是否是自己,如果不是,则解锁互斥锁并让出CPU,等待下一次调度。如果是自己,则打印自己的线程号,并更新当前应该打印的线程号。最后释放互斥锁,继续执行下一次循环。在主函数中,我们创建了三个线程,并等待它们全部执行完毕后退出程序。
这段代码可以保证线程按照顺序交替打印,输出结果类似于:线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线程 1 线程 2 线程 3 线程 1 …
阅读全文