好的,我们可以使用信号量(Semaphore)来实现两个线程的同步,达到交替打印数组的目的。下面是通过C语言使用 `sem_wait` 和 `sem_post` 实现的一个示例:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define SIZE 10
int arr[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int index = 0; // 用于跟踪打印的数组下标
sem_t sem1, sem2; // 信号量
void* print_even(void* arg) {
while (1) {
sem_wait(&sem1); // 等待信号量1
if (index < SIZE) {
printf("Thread 1: %d\n", arr[index]);
index++;
}
sem_post(&sem2); // 释放信号量2
if (index >= SIZE) break;
}
return NULL;
}
void* print_odd(void* arg) {
while (1) {
sem_wait(&sem2); // 等待信号量2
if (index < SIZE) {
printf("Thread 2: %d\n", arr[index]);
index++;
}
sem_post(&sem1); // 释放信号量1
if (index >= SIZE) break;
}
return NULL;
}
int main() {
pthread_t t1, t2;
// 初始化信号量,sem1初始值为1(让线程1先运行),sem2初始值为0
sem_init(&sem1, 0, 1);
sem_init(&sem2, 0, 0);
// 创建线程
pthread_create(&t1, NULL, print_even, NULL);
pthread_create(&t2, NULL, print_odd, NULL);
// 等待线程结束
pthread_join(t1, NULL);
pthread_join(t2, NULL);
// 销毁信号量
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}
解释:
- 信号量 `sem1` 和 `sem2` 用于控制线程执行的顺序。
- `sem1` 初始值为1,表示线程1先可以执行。`sem2` 初始值为0,表示线程2需要等待。
- 在 `print_even` 函数中,`sem_wait(&sem1)` 等待信号量 `sem1`,表示线程1需要运行,然后 `sem_post(&sem2)` 释放信号量2,让线程2可以运行。
- 在 `print_odd` 函数中,`sem_wait(&sem2)` 等待信号量 `sem2`,表示线程2需要运行,然后 `sem_post(&sem1)` 释放信号量1,让线程1可以运行。
- 这样的交替机制确保了两个线程按顺序交替打印数组元素。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |