编写一个程序,开启3个 线程,这3个线程的ID分别为ABC,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示,如ABCABC……依次递推;

2023-05-16

编写一个程序,开启 3 个 线程,这 3 个线程的 ID 分别为 ABC ,每个线程将自己的 ID 在屏幕上打印 10
遍,要求输出结果必须按 ABC 的顺序显示,如 ABCABC…… 依次递推;
提示: A 只能叫醒 B B 只能唤醒 C C 只能唤醒 A
#include <stdio.h>
#include <pthread.h>
pthread_cond_t cond; 	//条件变量
pthread_mutex_t mutex; 	//互斥锁
int flag = 0; 	//标志,0:打印 A, 1:打印 B, 2:打印 C
int count = 0; 

void* A(void* arg)
{
	while(1)
	{
		if(count == 10)     //打印10次后退出进程
		{
			pthread_exit(NULL);
		}
		pthread_mutex_lock(&mutex);//上锁
		if(flag == 0) 	//flag为0打印A
		{
			printf("A");
			flag = 1; 	//打印完后,flag置1,准备打印B
		}else 	//flag不为0,线程休眠
		{
			pthread_cond_wait(&cond,&mutex);
		}
		pthread_mutex_unlock(&mutex); 	//解锁
		pthread_cond_signal(&cond); 	//唤醒
	}
}

void* B(void* arg)
{
	while(1)
	{
		if(count == 10)     //打印10次后退出进程
		{
			pthread_exit(NULL);
		}
		pthread_mutex_lock(&mutex);//上锁
		if(flag == 1) 	//flag为1打印B
		{
			printf("B");
			flag = 2; 	//打印完后,flag置2,准备打印C
		}else 	//flag不为1,线程休眠
		{
			pthread_cond_wait(&cond,&mutex);
		}
		pthread_mutex_unlock(&mutex); 	//解锁
		pthread_cond_signal(&cond); 	//唤醒
	}
}

void* C(void* arg)
{
	while(1)
	{
		if(count == 10)     //打印10次后退出进程
		{
			printf("\n");
			pthread_exit(NULL);
		}
		pthread_mutex_lock(&mutex);//上锁
		if(flag == 2) 	//flag为2打印C
		{
			printf("C");
			flag = 0; 	//打印完后,flag置0,准备打印A
			count++;     //ABC都打印了一遍
		}else 	//flag不为2,线程休眠
		{
			pthread_cond_wait(&cond,&mutex);
		}
		pthread_mutex_unlock(&mutex); 	//解锁
		pthread_cond_signal(&cond); 	//唤醒
	}
}

int main(int argc, const char *argv[])
{
	//创建条件变量
	if(0 != pthread_cond_init(&cond,NULL))
	{
		perror("pthread_cond_init");
		return -1;
	}
	//创建互斥锁
	if(0 != pthread_mutex_init(&mutex,NULL))
	{
		perror("pthread_mutex_init");
		return -1;
	}
	//打开三个线程
	pthread_t pth1,pth2, pth3;
	if(0 != pthread_create(&pth1, NULL, A, NULL))
	{
		perror("pthread_create");
		return -1;
	}
	if(0 != pthread_create(&pth2, NULL, B, NULL))
	{
		perror("pthread_create");
		return -1;
	}
	if(0 != pthread_create(&pth3, NULL, C, NULL))
	{
		perror("pthread_create");
		return -1;
	}
	//阻塞,等待回收进程资源
	pthread_join(pth1, NULL);
	pthread_join(pth2, NULL);
	pthread_join(pth3, NULL);
	//销毁互斥锁
	pthread_mutex_destroy(&mutex);
	//销毁条件变量
	pthread_cond_destroy(&cond);
	return 0;
}

 结果:


ubuntu@ubuntu:day6$ ./a.out 
ABCABCABCABCABCABCABCABCABCABC

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写一个程序,开启3个 线程,这3个线程的ID分别为ABC,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示,如ABCABC……依次递推; 的相关文章

  • ubuntu搭建HTTP服务器

    1 首先安装apache2工具 sudo apt get update sudo apt get install apache2 apache2安装成功后 xff0c 我们可以在 var www html 目录下看到一个index html
  • 2021 大学生电子设计竞赛 G题 无人机 识别部分

    硬件解决方案 前视OpenMV与下视OpenMV 赛题整体解决方案 视觉只负责识别部分 采用定焦镜头 OpenMV只负责发送像素坐标系下的坐标信息 其他解算等决策部分均由嵌入式控制解决 解决思想 xff1a 围绕田地即地图中的绿色边缘巡航喷
  • c++:不使用STL标准模板库,实现双端队列

    c 43 43 xff1a 不使用STL标准模板库 xff0c 实现双端队列 文章目录 c 43 43 xff1a 不使用STL标准模板库 xff0c 实现双端队列0 简介1 怎么写1 1思路1 2代码 2 结尾 0 简介 最近一个实验验收
  • Android Android Studio 4.0 牛逼功能预览

    作者 xff1a wanbo 地址 xff1a https juejin im post 5db8cee351882557134d0411 新的 Android Studio 4 0 更换了全新的启动界面 xff0c 在今天 Google
  • Qt学习笔记之类继承关系图

  • C++:头文件递归包含问题(互相包含问题)

    目录 引言初始版本头文件守卫递归包含会怎么样为什么会出错前置声明是什么如何解决递归包含问题参考 引言 最近正在疯狂补技术债 xff0c 以及疯狂赶项目 大一大二摸的鱼终归是要还的 xff0c 也奉劝大家少摸鱼 xff0c 不然临近找工作可能
  • 拓展:示波器使用_波形分析

    这里主要对上一个练习中的波形图来拓展 xff0c 讲讲怎么在示波器输出的波形图中 xff0c 对该界面上的一些功能的使用 01 关于适应全屏 放大 缩小 对于输出波形 xff0c 经常要用到的即是适应屏幕 xff0c 以及放大缩小 xff0
  • 【已解决】element-ui组件嵌套太多层,导致内部el-input和el-select 等组件无法正常输入解决方案

    如果 element ui 组件嵌套太多层 xff0c 可能会导致内部的 el input 和 el select 等组件无法正常输入 出现这种问题通常是由于 z index 属性设置不正确导致的 解决这个问题的方法是调整组件的 z ind
  • 两个半天一刷Ubuntu入门指令

    目录 两个半天一刷Ubuntu入门指令 一 Ubuntu初次体验 二 设备驱动 三 Ubuntu用户组及其权限分配 四 压缩解压 五 Linux连接文件 六 vim编辑器 七 Linux下C编程 八 gcc和make及其Makefile的引
  • ENV环境配置及其下载网络组件包问题

    准备工作 Env 工具包含了 RT Thread 源代码开发编译环境和软件包管理系统 从 RT Thread 官网下载 Env 工具 在电脑上装好 git xff0c 软件包管理功能需要 git 的支持 git 的下载地址为https gi
  • 芯片flash保护(解锁)

    报错结果 Error while accessing a target resource The resource is perhaps notavailable 就是无法下载程序 解决办法 1 下载ST LINK Utility 链接 x
  • 2.RTT-点灯大师的修炼

    1 创建工程模板 相信大家通过学习上一篇文章 1 RTT 环境搭建 现在能熟练的创建一个标准模板了 xff0c 如果不会就跳回去学习一下吧 链接 xff1a 1 RTT 环境搭建 嵌入式路上的流浪的博客 CSDN博客 建立好的工程模板编译并
  • 4.RTT-UART-中断接收及轮询发送

    本期博客开始分享RTT的UART xff0c 利用战舰V3的uart2来输入输出一些字符串 UART xff08 Universal Asynchronous Receiver Transmitter xff09 通用异步收发传输器 xff
  • 12.RTT-IIC设备-AHT10温湿度传感器

    本系列博客更新结束啦 xff01 完结啦 xff01 xff01 xff01 撒花 xff01 xff01 xff01 关于RTT的设备和驱动专题更新完毕啦 xff0c 本期是最后一期 一段学习旅途的结束意味着下一段学习冒险的开始 虽然本系
  • RTduino+sht31温湿度传感器

    本次博客使用的是STM32F103C8T6 xff0c 因为该BSP已经对接好RTduino了可以直接上手使用 一 RTduino简介 RTduino是RT Thread实时操作系统的Arduino生态兼容层 xff0c 为RT Threa
  • 一文揭秘字节跳动、华为、京东的薪资职级

    声明 xff1a 本文所有数字均不是官方数据 xff0c 为网络资料收集整理 字节跳动 01 全球员工总数 字节的员工数量目前超过5万人 图片来源 xff1a 字节范 02 岗位职级 字节跳动的职级研发序列一共10级 xff1a 字节跳动创
  • ESP_C3在ubuntu下运行RT-Thread

    1 clone源代码RT Thread git clone git 64 github com RT Thread rt thread git 2 开始搭建ESP IDF环境 进入源码到bsp文件夹下找到ESP32 C3 xff0c 开始配
  • uniapp中使用弹出层

    uniapp中使用弹出层 因为业务的需要 xff0c 需要弹出一个复选框 xff0c 使用uniapp中自带的框架 使用 xff1a 第一步 xff1a 下载下示例项目 xff0c 找到主要的文件夹 第二步 xff1a 将该文件夹放到组件的
  • 手写一个uniapp的步骤条组件

    span class token operator lt span template span class token operator gt span span class token operator lt span view span
  • uniapp中的分页

    数据量过多就会使用分页 第一种 xff1a API span class token comment 和data同级 span span class token function variable function onReachBotto

随机推荐