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

Pthreads库

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

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

pthread_create() 创建一个线程

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

pthread_attr_destroy()

pthread_join()合并线程

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

示例

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

c 复制代码
#include <pthread.h>
#include <stdint.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>  // sleep()函数头文件


#define REPS 	     3
#define MAXTHREADS   128

long  			NumThreads=2;         		// Total number of threads working in parallel 并行的线程总数
int 	     	ThParam[MAXTHREADS];		// Thread parameters ...线程参数
pthread_t      	ThHandle[MAXTHREADS];		// Thread handles 线程句柄
pthread_attr_t 	ThAttr;						// Pthread attrributes

void *MTFlip(void* tid)
{
	int i;
	long ts = *((int *) tid);       	// My thread ID is stored here
	printf("\ntid=%d\n",tid);
	
	for(i=0;i<3;i++){
		sleep(1);
		printf("\n 正在使用ts=%d 执行计算任务,循环到i=%d\n",tid,i);
	}
	
	pthread_exit(0);
}


int main(int argc, char** argv)
{

	int 				a,i,ThErr;
	struct timeval 		t;
	double         		StartTime, EndTime;
	double         		TimeElapsed;

	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 值。

c 复制代码
#include <stdio.h>
#include <ctype.h>

int main()
{
   int i = 0;
   char str[] = "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);

用到两个结构体: timeval 和 timezone

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

示例2

c 复制代码
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
int main(){
    struct timeval tv;
    struct timezone tz;
    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

c 复制代码
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>  // sleep()函数头文件

#define REPS 	     1

int main()
{
	struct timeval 		t;
	double         		StartTime, EndTime;
	double         		TimeElapsed;

	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);

}
相关推荐
倒头就睡的小比特4 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼4 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark4 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her14 天前
并查集-听课笔记
笔记·算法·并查集
码流子4 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven4 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark4 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218614 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法