任务:创建线程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
渝北仙桃数据谷