【嵌入式Linux程序开发综合实验】创建线程A与B、信号量A’与B’,A与B线程运行后等待信号量到来,当A接收到信号量A’后输出打印,等待3秒后向B线程发送信号量B’;当B接收到信号量B’后输出打印

任务:创建线程A与B、信号量A’与B’,A与B线程运行后等待信号量到来,当A接收到信号量A’后输出打印,等待3秒后向B线程发送信号量B’;当B接收到信号量B’后输出打印,等待3秒后向A线程发送信号量A’。如此交替往复10次,程序安全退出。

流程图

根据题目要求,进行详细分析,设计程序,创建5.5文件夹,在main.c文件将题目要求复现。

随后将c程序文件编译成可执行文件main:

指令:gcc main.c -o main -pthread

打开终端执行main文件即可看到:A、B线程交替发送信号量B’和A’,并且二者间隔3秒,在经过10轮次后结束程序,之后在终端打印输出如下图所示。

可以看到实验结果满足题目设计要求,实验成功。

源码

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h> // 线程库
#include <semaphore.h> // 信号量库

#define NUM_ITERATIONS 10  // 线程执行次数

sem_t semA, semB;  // 申明两个信号量

// 线程A函数
void* threadA(void* arg) {  
    for (int i = 0; i < NUM_ITERATIONS; i++) {
        sem_wait(&semA); // 等待获取信号量A
        printf("A线程:得到A'信号量~\n");
        sleep(3);  // 延时3秒
        sem_post(&semB);  // 释放信号量B--让线程B执行
    }

    pthread_exit(NULL);
}

// 线程B函数
void* threadB(void* arg) { 
    for (int i = 0; i < NUM_ITERATIONS; i++) {
        sem_wait(&semB); // 等待获取信号量B
        printf("B线程:得到B'信号量~\n");
        sleep(3); // 延时3秒
        sem_post(&semA);  // 释放信号量B--让线程B执行
    }
    pthread_exit(NULL);
}

// 主函数:创建线程A与B、信号量A’与B’,A与B  线程运行后等待信号量到来,当A接收到信号量A’后输出打印,
// 等待3秒后向B线程发送信号量B’;当B接收到信号量B’后输出打印,等待3秒后向A线程发送信号量A’。如此交替往复10次,程序安全退出
int main() {
    pthread_t tidA, tidB;  // 定义两个线程的标识符

    sem_init(&semA, 0, 1);  // 初始化型号量A,初始值为1
    sem_init(&semB, 0, 0);  // 初始化型号量B,初始值为0

    // 创建A、B线程
    if (pthread_create(&tidA, NULL, threadA, NULL) != 0) {
        fprintf(stderr, "创建线程A失败\n");
        return 1;
    }

    if (pthread_create(&tidB, NULL, threadB, NULL) != 0) {
        fprintf(stderr, "创建线程B失败\n");
        return 1;
    }

    // 等待AB线程结束
    if (pthread_join(tidA, NULL) != 0) {
        fprintf(stderr, "连接A线程失败\n");
        return 1;
    }

    if (pthread_join(tidB, NULL) != 0) {
        fprintf(stderr, "连接B线程失败\n");
        return 1;
    }

    sem_destroy(&semA);  // 释放A信号量
    sem_destroy(&semB);  // 释放B信号量

    return 0;
}

更多:

可以将此代码交叉编译到Liunx开发板上面,在开发板上面看看效果~

2023.12.4

渝北仙桃数据谷

猜你喜欢

转载自blog.csdn.net/Akaxi1/article/details/134794361