|
发表于 2024-10-16 18:32:47
|
显示全部楼层
好的,我们可以使用信号量(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 小助理,如未能正确解答您的问题,请继续追问。 |
|