[C++多线程]pthread_attr_t详解

2015-10-26 sunsmile C++

之前一直以为pthread系列函数是linux内核中实现的,但当我尝试在linux内核中找到pthread_attr_t这个线程属性结构体的定义时发现这个结构体竟然在linux源码中没有定义,于是赶紧找找pthread_create函数的定义是否在linux源码中呢,结果发现同样不存在,以及后续查找的一系列pthread相关的操作函数都是不存在于linux内核源码中的,直觉告诉我这个pthread系列函数并不是linux内核中的。百度后发现原来这个系列是POSIX标准定义的。而且不仅在Linux中有实现,在Unix、FreeBSD等系统中都能够使用,甚至在Windows中都有相应的pthreads-win32的实现。此外,之所以没有给出pthread_attr_t结构体的内容,还有一个原因就是不想让用户去了解这个内容。比如,该结构体的初始化是通过函数pthread_attr_init实现的,而内存的回收是通过pthread_attr_destroy函数实现的。但心中仍然有不少疑问,其中最大的一个就是这个结构体对于通过pthread_create创建函数到底有多大作用,或者说,通过pthread函数以及pthread_attr_t属性结构能够创建出多少中不同的线程呢,这些线程都用在哪些环境中呢?

(1) 可结合状态线程
创建一个可结合状态的线程(Joinable,非分离状态)。在pthread_attr_t的默认值情况下,pthread_create在当前线程中创建一个新的线程,两个线程同时存在于CPU的调度队列中,因此,二者是平等的关系。但是在线程结束的时候,需要通过调用两个函数(pthread_join(thread_id,NULL)或者pthread_exit(NULL))实现两个线程的正常退出并且释放相应的内存空间。通常情况下,都是在原线程中调用pthread_join(new_thread_id, NULL)实现等待新建线程退出之后,再退出的功能;或者在新建线程执行结束之前调用函数pthread_exit(NULL)函数实现直接退出。当然只是通常情况下的使用方式,需要在一个线程中通过调用pthread_join(thread_id, NULL)函数等待另一个线程的结束之后再退出,或者在其中一个线程执行的最后调用函数pthread_exit(NULL)退出当前线程。

void* thread_result;
pthread_create(&tid,NULL,thread_function,NULL);
pthread_join(tid, &thread_result); 
(2) 脱离状态线程
创建一个脱离状态线程(detachable,非结合状态)。通过初始化pthread_attr_t结构变量之后,并且设置为DETACHABLE来实现创建脱离线程。此类线程的特点是两个线程更加独立,不存在原线程执行结束之前等待新建线程或者新建线程执行最后等待原线程的情况,而且新建线程退出是会自动释放占用的资源。


pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&tid, &attr, thread_function, NULL);




发表评论:

Powered by emlog 京ICP备15044591号-1