全部博文(346)
分类: C/C++
2008-09-03 10:12:12
数据定义头文件 /usr/include/bits/pthreadtypes.h |
|
typedef unsigned long int pthread_t; |
线程标识符 |
pthread_attr_t |
线程属性 |
1.1 #include |
函数pthread_create用来创建一个线程 |
int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg); |
返回: 如果成功0, 失败设置 Exxx 到 error |
第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。当二个参数设为空指针时,将生成默认属性的线程,否则将调用1.2节函数进行设置线程属性设置。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。
执行的函数原型必须为:
void func(void* param); //无返回值,可传一个void* 类型的参数
此函数类似于进程创建函数fork();
返回错误信息 |
|
EAGAIN |
系统限制创建新的线程,例如线程数目过多了 |
EINVAL |
第二个参数代表的线程属性值非法。 |
1.2. #include |
函数pthread_join用来等待一个线程的结束 |
int pthread_join (pthread_t tid, void ** status); |
返回: 如果成功0, 失败设置 Exxx 到 error |
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回
一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。
此函数类似于进程等待函数 waitpid();
返回错误信息 |
|
ESRCH |
线程被多个线程等待,第一个接收到信号的线程成功返回,其余调用pthread_join的线程返回次错误信息 |
1.3.#include |
获得线程号 |
pthread_t pthread_self (void); |
返回: 调用线程ID |
返回调用线程的线程标识符id,以用于其他函数。
此函数类似于进程函数 getpid();
1.4.#include |
设置线程状态为分离态 |
int pthread_detach (pthread_t tid); |
返回: 如果成功0, 失败设置 Exxx 到 error |
每个线程或者为joinable(默认),或者为detached。当一个joinable的线程结束时,这个线程的Id和推出状态让然保留直到另外一个线程调用pthread_join函数。但是detached线程犹如后台进程:当它结束时,所有资源将被释放,不需要等待我们去释放。
如果一个线程需要知道何时另一个线程结束,最好保持此线程为joinable.
此函数常常被调用来使自己detach如:
Pthread_detach(pthread_self());
1.5. #include |
结束调用线程 |
void pthread_exit (void *status); |
无返回值 |
一个线程的结束有两种途径,一种是函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。
唯一的参数是线程的返回值。他可能被其他线程的函数pthread_join处理。
#include
void thread(void)
{
int i;
for(i=0;i<3;i++)
printf("This is a pthread.\n");
}
int main(void)
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if(ret!=0){
printf ("Create pthread error!\n");
exit (1);
}
for(i=0;i<3;i++)
printf("This is the main process.\n");
pthread_join(id,NULL);
return (0);
}
ret=pthread_create(&id,NULL,(void *) thread,NULL);
主函数创建一个线程,使用默认线程属性NULL,线程执行体为函数thread,此函数无需传参数NULL
pthread_join(id,NULL);
等待线程函数结束。线程描述符为id