pthread_create函数
-
功能:创建一个新线程。 其作用,对应进程中fork() 函数
-
Int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg) -
返回值:成功:0; 失败:错误号 -----Linux环境下,所有线程特点,失败均直接返回错误号
-
参数:
-
pthread_t:当前Linux中可理解为:typedef unsigned long int pthread_t;
-
参数1:传出参数,保存系统为我们分配好的线程ID
-
参数2:通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。
-
参数3:函数指针,指向线程主函数(线程体),该函数运行结束,则线程结束。
-
参数4:线程主函数执行期间所使用的参数
创建线程
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
void *thrd_func(void*arg)
{
prrintf("In thread;thread id=%lu,pid=%d\n",pthread_self(),getpid());//子线程id
return NULL;
}
int main()
{
pthread_t tid;
int ret;
printf("In main 1:thread id=%lu,pid=%u\n",pthread_self(),getpid());//主控线程id
ret=pthread_create(&tid,NULL,thrd_func,NULL);//主控线程
if(ret!=0)
{
printf("pthread_create error\n");
exit(1);
}
printf("In main 2:thread id=%lu,pid=%u\n",pthread_self(),getpid());
return 0;
}
输出:
主控线程输出,pid输出;但是,子线程没有输出,原因:是因为线程还没来得及输出,父线程return了,退出进程地址空间
修改:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
void *thrd_func(void*arg)
{
prrintf("In thread;thread id=%lu,pid=%d\n",pthread_self(),getpid());//子线程id
return NULL;
}
int main()
{
pthread_t tid;
int ret;
printf("In main 1:thread id=%lu,pid=%u\n",pthread_self(),getpid());//主控线程id
ret=pthread_create(&tid,NULL,thrd_func,NULL);//主控线程
if(ret!=0)
{
fprint(stderr,"pthread_create error;%s\n",strerror(ret));
exit(1);
}
printf("In main 2:thread id=%lu,pid=%u\n",pthread_self(),getpid());
sleep(1);//主控线程等1秒
return 0;//退出进程地址空间
}
输出:
从输出结果看出:主控线程和子线程的线程id不同,但是进程id相同
循环创建线程
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
void *thrd_func(void*arg)
{
int i=(int)arg;
sleep(i);//为了使创建的线程有先后顺序
prrintf("%d thread;thread id=%lu,pid=%d\n",i+1,pthread_self(),getpid());//子线程id
return NULL;
}
int main()
{
pthread_t tid;
int ret,i;
for(i=0;i<5;i++)
{
ret=pthread_create(&tid,NULL,thrd_func,(void *)i);//主控线程
if(ret!=0)
{
fprint(stderr,"pthread_create error;%s\n",strerror(ret));
exit(1);
}
}
sleep(i);//主控线程等1秒
return 0;//将当前进程退出,退出进程地址空间
}
创建线程时,每一个线程函数都相当于一个回调函数,当线程创建成功后,函数自动调用;
注意:i值的使用,采用的是值传递的方式
功能:验证线程共享全局变量
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int var=100;
void *thrd_func(void*arg)
{
var=200;
prrintf(" thread\n");//子线程id
return NULL;
}
int main()
{
pthread_t tid;
printf("at first var=%d\n",var);
pthread_create(&tid,NULL,thrd_func,NULL);//主控线程
sleep(1);
printf("after pthread_create,var=%d\n ",var);
return 0;//将当前进程退出,退出进程地址空间
}
输出: