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

             

猜你喜欢

转载自blog.csdn.net/qq_36694133/article/details/134551271
今日推荐