C语言中的多线程调用

功能

开启一个线程,不断打印传进去的参数,并且每次打印后自增1

代码

#include<windows.h>
#include<pthread.h>
#include<stdio.h>

void* print(void *a) {
	int *ic=(int*)a;
	float *fc=(float*)(a+sizeof(int)*2);
	double *dc=(double*)(a+sizeof(int)*2+sizeof(float));
	char *cc=(char*)(a+sizeof(int)*2+sizeof(float)+sizeof(double));
	while(1) {
		printf("a[0]=%d a[1]=%d f=%.2f d=%.4lf c=%c\n",ic[0],ic[1],fc[0],dc[0],cc[0]);
		sleep(1);
		ic[0]++;
		ic[1]++;
		fc[0]++;
		dc[0]++;
		
		if(cc[0]<'Z'){
			cc[0]++;
		}else{
			cc[0]='A';
		}
	}
}

int main(int argc,char** argv) {
	pthread_t t;
	int a[]= {10,20};
	float f=3.14;
	double d=520.1314;
	char c='A';

	unsigned char *ac=(unsigned char*)a;
	unsigned char *fc=(unsigned char*)&f;
	unsigned char *dc=(unsigned char*)&d;
	unsigned char *cc=(unsigned char*)&c;

	unsigned char *buffer=(unsigned char*)malloc(sizeof(int)*2+sizeof(float)+sizeof(double)+sizeof(char));
	int i;
	for(i=0; i<8; i++) {
		buffer[i]=ac[i];
	}
	for(i=8; i<12; i++) {
		buffer[i]=fc[i-8];
	}
	for(i=12;i<20;i++){
		buffer[i]=dc[i-12];
	}
	buffer[20]=cc[0];

	int status=pthread_create(&t,NULL,print,(void*)buffer);
	
	pthread_join(t,NULL);

	return 0;
}

输出

解析

暂停函数sleep位于windows.h头文件,其参数单位为秒,sleep(1)则是暂停1秒

创建线程函数pthread_create位于pthread.h头文件,其参数为

第一个:线程变量

第二个:线程特性,一般填NULL即可

第三个:线程入口函数,这个函数就是我们自己定义返回类型为void*,参数列表为void*的print【注意:这是pthread_create的要求,我们自定义的函数必须是这个签名】

第四个:入口函数对应的参数对象指针【这样我们的入口函数才能访问传进来的参数】

我们会疑惑,为什么仅支持一个void*参数,那我们要传很多参数怎么办?

上面代码可以让我们搞懂这一点,我们把要传进去的参数,按照顺序转换到unsigned char*指针指向的空间,我们要传

int a[]= {10,20};
float f=3.14;
double d=520.1314;
char c='A';

那这是两个整数,一个单精度,一个双精度,一个字符

总字节数=sizeof(int)*2+sizeof(float)+sizeof(double)+sizeof(char)=4*2+4+8+1=21

于是我们申请了这么一个字节数组

再把这些数据按顺序赋值到buffer数组对应的位置

然后再开启线程。

print函数中则根据数据顺序和类型依次进行解析,打印,自增。

pthread_join这个是等待某个线程执行完毕的函数,如果我们在本程序不使用它,则程序一运行就停了,因为主线程结束了,我们开辟的线程t是后台线程,就跟着结束了。【后台线程会因为主线程的结束而结束】

我们在主线程中用了pthread_join(t,NULL),就会在主线程中等待t线程运行结束,主线程才会在那条语句继续往下执行。

             

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/176109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑苹果入门:资源、安装、使用、问题、必备工具、驱动篇

黑苹果入门&#xff1a;资源、安装、使用、问题、必备工具、驱动篇 一. 黑苹果入门&#xff1a;安装使用篇资源篇安装篇AMD处理器(桌面级)可以安装黑苹果macOS吗&#xff1f;黑苹果跑码是什么意思&#xff1f;进入语言选择界面&#xff0c;鼠标/键盘无法使用&#xff1f;安装完…

HashMap知识点总结

文章目录 HashMapConcurrentHashMap线程安全问题 HashMap 1、null作为key只能有一个&#xff0c;作为value可以有多个 2、容量&#xff1a; 1.7&#xff1a;默认161.8&#xff1a;初始化并未指定容量大小&#xff0c;第一次put才初始化容量 3、负载因子 默认0.75&#xff0…

代码文档浏览器 Dash mac中文版软件特色

Dash mac是一个基于 Python 的 web 应用程序框架&#xff0c;它可以帮助开发者快速构建数据可视化应用。Dash 的工作原理是将 Python 代码转换成 HTML、CSS 和 JavaScript&#xff0c;从而在浏览器中呈现交互式的数据可视化界面。Dash 提供了一系列组件&#xff0c;包括图表、表…

HarmonyOS ArkTS语言,运行Hello World(一)

一、下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows…

动态规划求 x 轴上相距最远的两个相邻点 java 代码实现

如图为某一状态下 x 轴上的情况&#xff0c;此时 E、F相距最远&#xff0c;现在加入一个点H&#xff0c;如果H位于点A的左边的话&#xff0c;只需要比较 A、H 的距离 和 E、F 的距离&#xff1b;如果点H位于点G的右边&#xff0c;则值需要比较 G、H 的距离 和 E、F 的距离&…

Docker安装Rabbitmq3.12并且prometheus进行监听【亲测可用】

一、安装Rabbitmq 下载镜像&#xff1a; docker pull rabbitmq:3.12-management 安装镜像&#xff1a; docker run -id --restartalways --namerabbitmq -v /usr/local/rabbitmq:/var/lib/rabbitmq -p 15692:15692 -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USERgu…

在线接口测试工具fastmock使用

1、fastmock线上数据模拟器 在平时的项目测试中&#xff0c;尤其是前后端分离的时候&#xff0c;前端人员需要测试调用后端的接口&#xff0c;这个时候会出现测试不方便的情况。此时我们可以使用fastmock平台在线上模拟出一个可以调用的接口&#xff0c;方便前端人员进行数据测…

linux服务器安装gitlab

一、安装gitlab sudo yum install curl policycoreutils-python openssh-server openssh-clients sudo systemctl enable sshd sudo systemctl start sshd sudo firewall-cmd --permanent --add-servicehttp curl https://packages.gitlab.com/install/repositories/gitla…

OpenAI乱局幕后大佬浮出水面:Quora联合创始人

丨划重点 ● Quora德安杰洛在过去的周末积极游说圈内科技领袖出任OpenAI首席执行官。 ● 在奥特曼与OpenAI董事会关于重返公司的谈判中&#xff0c;德安杰洛是真正的主角。 ● Quora前员工透露&#xff0c;德安杰洛性格倔强&#xff0c;很难被说服。 ● Quora之前开发了人工…

c++ 谓词

1. 一元谓词 #include <iostream> #include<vector> #include<algorithm>using namespace std;class CreaterFive{ public:bool operator()(int val){return val>5;} };int main() {vector<int> vec;for(int i0; i<10; i){vec.push_back(i);}ve…

QML22、常规组件Page

Page是一个容器控件,可以方便地向页面添加页眉和页脚项。 title : string 此属性保存页面标题。 header : Item 此属性保存页眉项。标题项被定位到顶部,并调整大小为页面的宽度。缺省值为空。 注意:指定一个ToolBar, TabBar,或DialogButtonBox作为页眉会自动将各自的ToolBar…

使用hping3和wrk模拟泛洪

一、hping3 1、syn随机ip泛洪 hping3 --flood -S --rand-source -p 端口 目标ip hping3 -c 10000 -d 120 -S -p 80 --flood --rand-source 192.168.112.130​说明&#xff1a; -c 100000 packets 发送的数量 -d 120 packet的大小 -S 只发送syn packets -p 80 目标端口&am…

GNU工具链

1. GNU介绍 工具链典型的例子就是GNU工具链。 GNU工具链是由GNU项目产生的各种编程工具的集合&#xff0c;用于开发应用程序与操作系统。 GNU工具链在针对嵌入式系统的Linux内核、BSD及其它软件的开发中起着至关重要的作用。 GNU工具链中的部分工具也被Mac OS X, Microsoft W…

Redis篇---第十四篇

系列文章目录 文章目录 系列文章目录前言一、为什么Redis的操作是原子性的,怎么保证原子性的?二、了解Redis的事务吗?四、Redis 的数据类型及使用场景前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

【人生苦短,我学 Python】(1)初识 Python

目录 1. 简述2. 什么是 Python&#xff1f;3. 面向对象简述3.1 面向过程3.2 面向对象3.3 面向对象的主要优点3.4 面向对象的基本概念3.5 面向对象程序设计 4. Python语言的版本和解释器5. Python 编程工具6. Python 的三种编程方式7. 简单的 Python 程序8. 高级一点的 Python 程…

15位、7位可控字符下的任意命令执行

可控字符串 长度受限情况下 Getshell

【OpenCV实现图像:使用OpenCV进行物体轮廓排序】

文章目录 概要读取图像获取轮廓轮廓排序小结 概要 在图像处理中&#xff0c;经常需要进行与物体轮廓相关的操作&#xff0c;比如计算目标轮廓的周长、面积等。为了获取目标轮廓的信息&#xff0c;通常使用OpenCV的findContours函数。然而&#xff0c;一旦获得轮廓信息后&#…

基于STM32的电子时钟(论文+源码)

1. 系统设计 电子时钟是一种广泛使用的工具&#xff0c;其可以帮助人们准确掌握时间&#xff0c;本课题基于STM32的电子时钟系统的设计&#xff0c;在功能上设计如下&#xff1a; 具有电子时钟的基本功能&#xff0c;显示年月日&#xff0c;时分秒等基本信息&#xff1b;可以…

经典双指针算法试题(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、有效三角形的个数1、题目讲解2、讲解算法原理3、代码实现 二、查找总价格为目标值的两个商…

JavaDS —— 初识集合框架 + 时间/空间复杂度

目录 1. 初识集合框架 1.1 集合框架的初识 1.2 什么是数据结构&#xff1f; 2. 时间与空间复杂度 2.1 时间复杂度 2.2 大O的渐进表示法 2.3 常见时间复杂度计算举例 2.4 空间复杂度 1. 初识集合框架 1.1 集合框架的初识 什么叫集合&#xff1f;什么叫框架&#xff1f;什么又叫集…