功能
开启一个线程,不断打印传进去的参数,并且每次打印后自增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线程运行结束,主线程才会在那条语句继续往下执行。