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>
4
void* th(void *data);
5
int 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
}
21
void* 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>
5
void* th(void *data);
6
int 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
}
23
void* 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