鱼C论坛

 找回密码
 立即注册
查看: 699|回复: 3

求!

[复制链接]
发表于 2024-10-16 18:15:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有一个全局数组int arr[]={1,2,3,4,5,6,7,8,9,10},现需要使用两个线程按顺序交替将数组内容打印出来(每个线程打印一次,直到全部打印完),不允许使用延时函数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-16 18:15:29 | 显示全部楼层
要实现两个线程交替打印数组中的元素,我们可以使用互斥锁(Mutex)和条件变量(Condition Variable)来同步线程。确保每个线程在正确的时机打印出正确的值。以下是使用C语言实现的简单示例:

  1. #include <stdio.h>
  2. #include <pthread.h>

  3. #define SIZE 10

  4. int arr[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  5. int index = 0;  // 用于跟踪打印的数组下标
  6. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  7. pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  8. int turn = 0;  // 用于记录该哪个线程打印,0表示线程1,1表示线程2

  9. void* print_even(void* arg) {
  10.     while (1) {
  11.         pthread_mutex_lock(&mutex);

  12.         while (turn != 0 && index < SIZE) {
  13.             pthread_cond_wait(&cond, &mutex);
  14.         }

  15.         if (index < SIZE) {
  16.             printf("Thread 1: %d\n", arr[index]);
  17.             index++;
  18.             turn = 1;  // 切换到线程2
  19.         }

  20.         pthread_cond_signal(&cond);
  21.         pthread_mutex_unlock(&mutex);

  22.         if (index >= SIZE) break;
  23.     }
  24.     return NULL;
  25. }

  26. void* print_odd(void* arg) {
  27.     while (1) {
  28.         pthread_mutex_lock(&mutex);

  29.         while (turn != 1 && index < SIZE) {
  30.             pthread_cond_wait(&cond, &mutex);
  31.         }

  32.         if (index < SIZE) {
  33.             printf("Thread 2: %d\n", arr[index]);
  34.             index++;
  35.             turn = 0;  // 切换到线程1
  36.         }

  37.         pthread_cond_signal(&cond);
  38.         pthread_mutex_unlock(&mutex);

  39.         if (index >= SIZE) break;
  40.     }
  41.     return NULL;
  42. }

  43. int main() {
  44.     pthread_t t1, t2;

  45.     pthread_create(&t1, NULL, print_even, NULL);
  46.     pthread_create(&t2, NULL, print_odd, NULL);

  47.     pthread_join(t1, NULL);
  48.     pthread_join(t2, NULL);

  49.     return 0;
  50. }
复制代码


解释:
- 使用两个线程 `t1` 和 `t2` 分别调用 `print_even` 和 `print_odd` 函数。
- 线程间通过 `turn` 变量来决定该哪个线程打印。
- `pthread_mutex_lock` 和 `pthread_mutex_unlock` 用于锁定和解锁,以防止打印顺序的错乱。
- `pthread_cond_wait` 和 `pthread_cond_signal` 用来挂起和唤醒线程,实现交替运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-16 18:26:24 | 显示全部楼层
FishC 发表于 2024-10-16 18:15
要实现两个线程交替打印数组中的元素,我们可以使用互斥锁(Mutex)和条件变量(Condition Variable)来同 ...

使用sem_wait还有sem_post实现线程
同步操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-16 18:32:47 | 显示全部楼层
轻语远歌 发表于 2024-10-16 18:26
使用sem_wait还有sem_post实现线程
同步操作


好的,我们可以使用信号量(Semaphore)来实现两个线程的同步,达到交替打印数组的目的。下面是通过C语言使用 `sem_wait` 和 `sem_post` 实现的一个示例:

  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <semaphore.h>

  4. #define SIZE 10

  5. int arr[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  6. int index = 0;  // 用于跟踪打印的数组下标
  7. sem_t sem1, sem2;  // 信号量

  8. void* print_even(void* arg) {
  9.     while (1) {
  10.         sem_wait(&sem1);  // 等待信号量1

  11.         if (index < SIZE) {
  12.             printf("Thread 1: %d\n", arr[index]);
  13.             index++;
  14.         }

  15.         sem_post(&sem2);  // 释放信号量2

  16.         if (index >= SIZE) break;
  17.     }
  18.     return NULL;
  19. }

  20. void* print_odd(void* arg) {
  21.     while (1) {
  22.         sem_wait(&sem2);  // 等待信号量2

  23.         if (index < SIZE) {
  24.             printf("Thread 2: %d\n", arr[index]);
  25.             index++;
  26.         }

  27.         sem_post(&sem1);  // 释放信号量1

  28.         if (index >= SIZE) break;
  29.     }
  30.     return NULL;
  31. }

  32. int main() {
  33.     pthread_t t1, t2;

  34.     // 初始化信号量,sem1初始值为1(让线程1先运行),sem2初始值为0
  35.     sem_init(&sem1, 0, 1);
  36.     sem_init(&sem2, 0, 0);

  37.     // 创建线程
  38.     pthread_create(&t1, NULL, print_even, NULL);
  39.     pthread_create(&t2, NULL, print_odd, NULL);

  40.     // 等待线程结束
  41.     pthread_join(t1, NULL);
  42.     pthread_join(t2, NULL);

  43.     // 销毁信号量
  44.     sem_destroy(&sem1);
  45.     sem_destroy(&sem2);

  46.     return 0;
  47. }
复制代码


解释:
- 信号量 `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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-27 17:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表