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线程运行结束,主线程才会在那条语句继续往下执行。

             

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拆解现货黄金隔夜利息计算公式

在讨论现货黄金投资手续费的时候&#xff0c;隔夜利息是经常被忽略的一个方面&#xff0c;但它是投资者不得不考虑的成本因素&#xff0c;特别是在中长线交易的情况下。隔夜利息是根据投资者的持仓数量和交易方向所计算出的利息&#xff0c;如果投资者需要持仓过夜&#xff0c;…

9.3 Windows驱动开发:内核解析PE结构节表

在笔者上一篇文章《内核解析PE结构导出表》介绍了如何解析内存导出表结构&#xff0c;本章将继续延申实现解析PE结构的PE头&#xff0c;PE节表等数据&#xff0c;总体而言内核中解析PE结构与应用层没什么不同&#xff0c;在上一篇文章中LyShark封装实现了KernelMapFile()内存映…

Transformer的一点理解,附一个简单例子理解attention中的QKV

Transformer用于目标检测的开山之作DETR&#xff0c;论文作者在附录最后放了一段简单的代码便于理解DETR模型。 DETR的backbone用的是resnet-50去掉了最后的AdaptiveAvgPool2d和Linear这两层。 self.backbone nn.Sequential(*list(resnet50(pretrainedTrue).children())[:-2…

电脑乐园杂志电脑乐园杂志社电脑乐园编辑部2023年第3期目录

《电脑乐园》投稿邮箱&#xff1a;cnqikantg126.com(注明投稿“《电脑乐园》”) Q Q &#xff1a;695548262 微信号&#xff1a;f99832970 计算机信息技术 计算机人工智能识别技术的应用探析 (0001) 于洋;李泰元 项目教学法用于 中职计算机应用基础教学中的策略 (0004) 张莉…

LabVIEW如何获取波形图上游标所在位置的数值

LabVIEW如何获取波形图上游标所在位置的数值 获取游标所在位置数值的一种方法是利用波形图的游标列表属性。 在VI的程序框图中&#xff0c;右键单击波形图并选择创建引用 &#xff0c;然后将创建的引用节点放在程序框图上。 在程序框图上放置一个属性节点&#xff0c;并将其…

后端真批量新增的使用

1,添加真批量新增抽象接口 public interface EasyBaseMapper extends BaseMapper { /** * 批量插入 仅适用于mysql * * return 影响行数 */ Integer insertBatchSomeColumn(Collection entityList); } 2,新增类,添加真批量新增的方法 public class InsertBatchSqlInjector ext…

聚焦数字化项目管理——2023年PMI项目管理大会亮点回顾

11月18日-19日&#xff0c;由PMI&#xff08;中国&#xff09;主办的2023年PMI项目管理大会在上海浦东嘉里大酒店圆满召开。本次大会以“数智时代&#xff0c;汇创未来”为主题&#xff0c;聚焦数智时代大背景下的项目管理行业发展和人才培养&#xff0c;吸引了海内外千余名项目…

基于Android校园交流uniAPP+vue 微信小程序v7e1

本系统结合现今XX校园交流APP的功能模块以及设计方式进行分析&#xff0c;使用Android平台和Ssm框架进行开发设计&#xff0c;具体研究内容如下&#xff1a; (1) 系统管理员主要对用户管理、类型管理、娱乐天地管理、投诉举报管理、学习平台、我的收藏管理、系统管理等功能进…

利用opencv/暗通道方法检测图像是否有雾-利用opencv/暗通道方法对深度学习目标检测算法结果进行二次识别提高准确率

目录 1 Python版本 2 C++版本 本来利用yolov5检测浓雾的,但是发现yolov5的检测结果会把一些正常天气检测成雾天,这种时候其实可以通过增加正常类,也就是将正常天气被误检成浓雾的图片当成一个正常类别去训练,但是不想标注图片,也不想重新训练算法了,因此想是不是可以用…

wvp-gb28181-pro打包

生成可执行jar cd wvp-GB28181-pro mvn package复制错误已复制 生成war cd wvp-GB28181-pro mvn package -P war 生成的包的路径 wvp-GB28181-pro\target

每日汇评:黄金从月度高点回落,但下行前进似乎有限

在美国FOMC会议纪要基调更加鹰派之后&#xff0c;金价走低&#xff1b; 美元疲软可能为金价提供一些支撑&#xff0c;并有助于限制进一步下跌&#xff1b; 金价屡次未能突破 2000 美元大关&#xff0c;多头必须保持谨慎&#xff1b; 金价延续了隔夜从2007美元区域&#xff08;或…

海康威视监控相机的SDK与opencv调用(非工业相机)

1.研究内容 本篇主要对海康威视的监控相机的SDK回调进行研究&#xff0c;并于opencv结合&#xff0c;保存图像,以供后续其他处理&#xff0c;开发语言为C 2.步骤及方法 2.1 海康SDK介绍 海康SDK下载地址 根据自身编译环境&#xff0c;下载对应的SDK&#xff0c;需要注意的是…

身份证号码校验

根据《新版外国人永久居留身份证适配性改造要点》&#xff0c;公司需要把代码中对身份证的校验进行优化 就文档内容可以看到需要优化的要点是&#xff1a; 新版永居证号码以 9 开头 受理地区代码出生日期顺序码校验码&#xff1b;&#xff08;共18位&#xff09; eg&#xff…

python获取灰度图

思路很简单&#xff0c;就是读取图片&#xff0c;获取高宽&#xff0c;创造一个图片的模板&#xff0c;然后依次将三个通道的像素加权融合一下&#xff0c;再保存。 import cv2 import numpy as np import osroot "./test" for file in os.listdir(root):print(…

渗透工具---BurpSuite 插件开发之HelloWorld

本文主要记录如何利用burp官方的新版API即MontoyaApi 写helloworld&#xff08;上一篇的demo使用旧版api写的&#xff0c;这篇及后续开发将采用新版api&#xff09; 先看效果图 更多详细内容见下方 这里有更详细更全面的代码内容 以及配置相关的内容 https://mp.weixin.qq.co…

UnityAI——常用感知类型的实现

游戏中最常用的感知类型是视觉和听觉。对于视觉&#xff0c;需要配对的触发器和感知器&#xff0c;听觉也是。总的来说&#xff0c;游戏中有多个触发器和感知器&#xff0c;可以通过事件管理器同意对其进行管理 所有触发器的基类——Trigger类 在介绍感知之前&#xff0c;需要…

HarmonyOS ArkTS 基础组件的使用(四)

1 组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;…

8-flask django执行原生sql和sqlalchemy执行原生sql、flask-sqlalchemy使用、flask-migrate使用

1 原生sql(django-orm如何执行原生sql) 1.1 django执行原生sql 1.2 sqlalchemy执行原生sql 2 flask-sqlalchemy使用 3 flask-migrate使用 1 原生sql(django-orm如何执行原生sql) 1.1 django执行原生sql import osos.environ.setdefault(DJANGO_SETTINGS_MODULE, djangoProjec…

为什么要学习 Linux?

为什么要学习 Linux&#xff1f; 用 Linus 本人的话来说&#xff0c;用户不需要接触到操作系统。操作系统的功能是给应用程序提供API&#xff0c;因而&#xff0c;只有开发人员才需要学习操作系统。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资料&#xff0c;然后我根…

【Unity细节】如何调节标签图标的大小(select icon)—标签图标太大遮住了物体

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…