1.线程创建函数
int pthread_create(pthread_t * thread,const pthread_attr_t * attr,void *(*start_routine)(void*), void * arg);
返回:
成功返回0,失败返回错误号,错误号说明如下:
EAGAIN 创建线程的系统资源不足,或者超过系统限制的最大线程数PTHREAD_THREADS_MAX
EINVAL 创建线程的属性非法,就是第二个参数设置不正确。
EPERM 调用者没有足够的权限。
参数说明:
pthread_t * thread:线程ID
pthread_attr_t * attr:线程属性,如果是NULL,则采用缺省属性。
void *(*start_routine)(void*)线程执行代码
void * arg传递给线程执行代码过程的参数
2.线程等待函数
int pthread_join(pthread_t thread, void **value_ptr);
返回:成功返回0,失败返回非0的错误号。错误号说明如下:
EINVAL 指定的线程ID不是合法的ID,就是不可JOIN的线程。
ESRCH 指定的线程ID不存在。
EDEADLK指定的线程被死锁。
参数说明:
thread:就是要JOIN的线程ID。
value_ptr:就是线程函数的返回值。
3.线程退出函数
void pthread_join(void* rtv);
参数说明:
rtv:就是线程函数的返回值。相当于线程函数中的return返回的值,被传递给pthread_join的第二个参数
线程创建例子
1#include <stdio.h>
2#include <pthread.h>
3#include <stdlib.h>
4void* th(void *data);
5int main()
6{
7 pthread_t th1;
8 char d[]="Hello我是参数!";
9 int re=pthread_create(&th1,NULL,(void*)th,&d);
10 if(re)
11 {
12 printf("创建线程失败\n");
13 exit(1);
14 }
15 char *rd;
16 pthread_join(th1,(void**)&rd);
17 printf("线程返回的数据%s\n",rd);
18 printf("主程序退出\n");
19 return 0;
20}
21void* th(void *data)
22{
23 int i=0;
24 for(;i<10;i++)
25 {
26 printf("\tThread -1:%s\n",data);
27 sleep(1);
28 }
29 return data;
30}
31
线程退出例子
1#include <stdio.h>
2#include <pthread.h>
3#include <stdlib.h>
4#include <sys/types.h>
5void* th(void *data);
6int main()
7{
8 pthread_t th1;
9 char d[]="Hello我是参数!";
10 int re=pthread_create(&th1,NULL,(void*)th,&d);
11 if(re)
12 {
13 printf("创建线程失败\n");
14 exit(1);
15 }
16 char *rd;
17 pthread_join(th1,(void**)&rd);
18 printf("线程返回的数据%s\n",rd);
19 printf("主程序退出\n");
20 /**//*主进程结束,子线程也结束并自动释放资源。*/
21 return 0;
22}
23void* th(void *data)
24{
25 int i=0;
26 for(;;i++)
27 {
28 printf("\tThread -1:%d\n",i);
29 if(i==5)
30 {
31 pthread_exit("hello");
32 }
33
34 }
35 return data;
36}
37