当前位置: 首页 > news >正文

CPU_多线程操作图片_代码详解

Pthreads库

pthread_attr()初始化线程的各项属性

pthread_attr_setdetachstate()为初始化的线程设置属性

pthread_create()创建一个线程

第一个参数是每个线程的“句柄”,对操作系统非常重要,使操作系统能够跟踪线程。
第二个参数对于所有线程都相同,内容是线程属性
第三个参数告诉线程要执行的任务
第四个参数经过一些指针操作后,该参数指向TheParam[i],每个线程知道自己是谁

pthread_attr_destroy()

pthread_join()合并线程

用于将任何给定的线程合并到最初创建它的线程中。你可以将“合并”过程想象成“毁灭”线程,或者父线程“吞食”刚刚创建的线程。

示例

main主函数被重复执行3次,每次执行使用2个线程完成计算任务。

#include<pthread.h>#include<stdint.h>#include<ctype.h>#include<stdlib.h>#include<stdio.h>#include<sys/time.h>#include<unistd.h>// sleep()函数头文件#defineREPS3#defineMAXTHREADS128longNumThreads=2;// Total number of threads working in parallel 并行的线程总数intThParam[MAXTHREADS];// Thread parameters ...线程参数pthread_tThHandle[MAXTHREADS];// Thread handles 线程句柄pthread_attr_tThAttr;// Pthread attrributesvoid*MTFlip(void*tid){inti;longts=*((int*)tid);// My thread ID is stored hereprintf("\ntid=%d\n",tid);for(i=0;i<3;i++){sleep(1);printf("\n 正在使用ts=%d 执行计算任务,循环到i=%d\n",tid,i);}pthread_exit(0);}intmain(intargc,char**argv){inta,i,ThErr;structtimevalt;doubleStartTime,EndTime;doubleTimeElapsed;if((NumThreads<1)||(NumThreads>MAXTHREADS)){printf("\nNumber of threads must be between 1 and %u... Exiting abruptly\n",MAXTHREADS);exit(EXIT_FAILURE);}else{if(NumThreads!=1){printf("\nExecuting the multi-threaded version with %li threads ...\n",NumThreads);}else{printf("\nExecuting the serial version ...\n");}}gettimeofday(&t,NULL);StartTime=(double)t.tv_sec*1000000.0+((double)t.tv_usec);if(NumThreads>1){for(a=0;a<REPS;a++){pthread_attr_init(&ThAttr);pthread_attr_setdetachstate(&ThAttr,PTHREAD_CREATE_JOINABLE);printf("\n 代码重复执行第 %d 次\n",a+1);for(i=0;i<NumThreads;i++){ThParam[i]=i;ThErr=pthread_create(&ThHandle[i],&ThAttr,MTFlip,(void*)&ThParam[i]);if(ThErr!=0){printf("\nThread Creation Error %d. Exiting abruptly... \n",ThErr);exit(EXIT_FAILURE);}}pthread_attr_destroy(&ThAttr);for(i=0;i<NumThreads;i++){pthread_join(ThHandle[i],NULL);}}}else{printf("\n单线程串行执行代码\n");}gettimeofday(&t,NULL);EndTime=(double)t.tv_sec*1000000.0+((double)t.tv_usec);TimeElapsed=(EndTime-StartTime)/1000.00;TimeElapsed/=(double)REPS;printf("\n\nTotal execution time: %9.4f ms ",TimeElapsed);return(EXIT_SUCCESS);}

toupper()小写字母转换为大写字母

C 库函数int toupper(int c)把小写字母转换为大写字母。
反参:
如果 c 有相对应的大写字母,则该函数返回 c 的大写字母,否则 c 保持不变。返回值是一个可被隐式转换为 char 类型的 int 值。

#include<stdio.h>#include<ctype.h>intmain(){inti=0;charstr[]="runoob";while(str[i]){putchar(toupper(str[i]));i++;}return(0);}

gettimeofday() 获取到当前时间的秒数

该函数的头文件在/usr/include/sys/time.h头文件中。

函数原型:int gettimeofday(struct timeval*tv, struct timezone *tz);

用到两个结构体:timevaltimezone

这两个结构体定义在/usr/include/linux/time.h头文件中。

示例2

#include<stdio.h>#include<sys/time.h>#include<unistd.h>intmain(){structtimevaltv;structtimezonetz;gettimeofday(&tv,&tz);printf("\ntv_sec; %d\n",tv.tv_sec);printf("tv_usec; %d\n",tv.tv_usec);printf("tz_minuteswest; %d\n",tz.tz_minuteswest);printf("tz_dsttime, %d\n",tz.tz_dsttime);}

示例2

#include<stdio.h>#include<sys/time.h>#include<unistd.h>// sleep()函数头文件#defineREPS1intmain(){structtimevalt;doubleStartTime,EndTime;doubleTimeElapsed;gettimeofday(&t,NULL);StartTime=(double)t.tv_sec*1000000.0+((double)t.tv_usec);sleep(30);//休眠30秒gettimeofday(&t,NULL);EndTime=(double)t.tv_sec*1000000.0+((double)t.tv_usec);TimeElapsed=(EndTime-StartTime)/1000.00;TimeElapsed/=(double)REPS;printf("\n\nTotal execution time: %9.4f ms ",TimeElapsed);}

http://www.jsqmd.com/news/467388/

相关文章:

  • 纯电动汽车动力经济性仿真:Cruise 与 Simulink 联合之旅
  • 【教学类-133-01】20260309狮虎旗(井字棋)01豆包初稿HTML+ CSS + JavaScript
  • 西门子200smart模拟量处理:滤波与报警的完美结合
  • 从DeepSig RadioML 2018.01A到定制化数据集:单信噪比单调制数据的提取与实战应用
  • 玩转PLC液体混合作业线(附全套工业组态方案)
  • 性价比优先:预算低情景下自动化立体仓库公司的选型指南 - 品牌策略主理人
  • Claude Code Hooks 实战:8大事件与10+脚本的自动化开发指南
  • STM32四轴联动运动控制:直线圆弧插补技术,编码器反馈与加减速控制,原理图和源代码全解析
  • 猎翼无人机,提升探测效率:2026军用目标识别无人机蜂群系统供应商推荐 - 品牌2026
  • 探索风光储交流微网中的双向储能变流器
  • 【小龙虾-OpenClaw】Railway如何部署小龙虾-OpenClaw
  • Hutool StrUtil 实战技巧:提升Java字符串处理效率
  • PAT-Broken Keyboard (20)
  • api接口
  • 保姆级教程:在海光hygon c86 7151上安装定制版Ubuntu18.04避坑全记录
  • QT集成QRencode与Code128:从源码集成到界面绘制的条码生成实践
  • 2026年耐磨复合管优质品牌推荐指南:连续玻纤带聚乙烯复合管厂家/钢纤增强聚乙烯复合压力管厂家/选择指南 - 优质品牌商家
  • 方向盘后的数学游戏:用MPC玩转四驱电动车轨迹跟踪
  • 猎翼无人机,探测识别二合一:2026军用目标监控无人机蜂群系统供应商推荐 - 品牌2026
  • 海康威视摄像头RTSP流接入YOLOv5的3个常见坑及解决方案(附完整代码)
  • 保姆级教程:用YOLOv10训练COCO数据集(附CUDA配置避坑指南)
  • MySql5.7下载与安装超详教程(保姆级教学)-mysql5.7安装配置教程
  • 益生菌哪个品牌效果最好?打工人告别腹脂囤积的实用指南 - 博客万
  • DFS文件服务器实战:用Winserver 2019实现跨机房文件自动同步
  • 解密京东联盟h5st 3.1:从加密原理到逆向调试技巧(含常见403解决方案)
  • 老板:996是福报!,我:雷总说未来3天2小时,您咋不说?
  • 5分钟搞懂知识追踪模型:从BKT到DKT的演变与实战应用
  • Android Telecom框架实战:车机蓝牙通话全流程解析(附常见问题排查)
  • 鸿蒙开发必备:hpm-cli在Windows下的完整安装指南(含Node.js版本避坑)
  • 猎翼无人机,远距精准:2026军用目标追踪监控无人机蜂群系统供应商推荐 - 品牌2026