鱼C论坛

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

求!

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

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

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

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

使用道具 举报

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

#define SIZE 10

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

void* print_even(void* arg) {
    while (1) {
        pthread_mutex_lock(&mutex);

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

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

        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);

        if (index >= SIZE) break;
    }
    return NULL;
}

void* print_odd(void* arg) {
    while (1) {
        pthread_mutex_lock(&mutex);

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

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

        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);

        if (index >= SIZE) break;
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;

    pthread_create(&t1, NULL, print_even, NULL);
    pthread_create(&t2, NULL, print_odd, NULL);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用sem_wait还有sem_post实现线程
同步操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


好的,我们可以使用信号量(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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 09:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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