1.线程创建和终止
- int pthread_creat(pthread_t *pthread,const pthread_attr_t *attr, void*(*start_rtn)(void*),void *restrict arg)
调用改函数可以创建一个线程,线程创建后执行start_rtn指定的函数。pthread_attr_t用来指定线程创建后的属性,NULL表示线程属性为默认的。restrict arg是函数start_rtn的参数。如果需要多个参数可以用结构体代替。
- struct myThrdParam
- {
- int fileSrcID;
- bool isFinished;
- bool isRunOnce;
- };
- void* threadProc1(void* ptr)
- {
- myThrdParam* myParam = (myThrdParam*)ptr;
- }
2.线程控制函数
- pthread_t pthread_self(void);
函数作用:获得线程自身的ID。pthread_t的类型为unsigned long int,所以在打印的时候要使用%lu方式,否则将产生奇怪的结果。
函数pthread_join用来等待一个线程的结束。函数原型为:
- extern int pthread_join __P (pthread_t __th, void **__thread_return);
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。如果执行成功,将返回0,如果失败则返回一个错误号。
- void pthread_detach(pthread_t);
创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码),所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似于wait,waitpid)
但是调用pthread_join(pthread_id)后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此,比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的链接),这时可以在子线程中加入代码
pthread_detach(pthread_self())
或者父线程调用
pthread_detach(thread_id)(非阻塞,可立即返回)
这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源
阅读(608) | 评论(0) | 转发(0) |