一 线程属性:
(0)线程属性主要包括:
1.pthread_attr_t结构中的属性:
*struct pthread_attr_t //posix win32的结构体
{
unsigned long valid;
void *stackaddr;//栈的最低地址
size_t stacksize;//栈的大小
int detachstate;//分离属性
struct sched_param param;
int inheritsched;
int contentionscope;
#if HAVE_SIGSET_T
sigset_t sigmask;
#endif /* HAVE_SIGSET_T */
};
2.并发度。
3.可取消选项和可取消类型。
(1)可使用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来。
*int pthread_attr_init(pthread_attr_t *attr):初始化pthread_attr_t结构。
pthread_attr_init初始化的结构就是系统实现支持的线程所有属性的默认值,要改变其中个别属性的值,就需要调用其它函数。
*int pthread_attr_destroy(pthread_attr_t * attr):去除对pthread_attr_t结构的初始化。
(2)分离状态:如果开始时就知道不需要了解线程的终止状态,那么可以修改pthread_attr_t结构的detachstate线程属性,让线程以分离状态启动。
当线程处于分离状态时,线程底层存储资源可以在线程终止时立即被收回。
*pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate):设置线程属性detachstate。
detachstate:PTHREAD_CTREATE_DETACH(分离状态启动)或PTHREAD_CREATE_JOINABLE(正常状态启动)。
*pthread_attr_getdetachstate(const pthread_attr_t *attr,int *detachstate):获取当前的线程属性detachstate。
*线程进入分离状态的方法:(1)线程调用pthread_detach(pthread_t tid);(2)设置detachstate属性以分离状态启动。
(3)线程栈:
*对于进程来说,虚拟地址空间的大小是固定的。但对于线程,同样大小的虚拟地址空间必须被所有线程共享。如果程序使用太多线程,这时就要减少线程栈默认的栈大小。另一方面,如果线程调用的函数分配大量的自动变量或者调用的函数涉及很深的栈帧,这时需要增加线程栈的大小。
*pthread_attr_setstacksize和pthread_attr_getstacksize:设置或获取线程属性stacksize(线程栈大小)。
*pthread_attr_setstack和pthread_attr_getstack:设置或获取线程栈的属性。
(4)并发度:控制着用户级线程可以映射的内核线程或进程的数目。并发度只在M:N的线程实现中有意义,因为LinuxThreads和NPTL是1:1线程实现的,所以设置并发度没有任何意义,即在linux上存在这些函数仅仅是为了与其他系统兼容,对于程序的执行没有任何影响。(来源:man pthread_setconcurrency)。
*pthread_setconcurrency和pthread_setconcurrency:设置和获取并发度。
(5)取消选项:可取消状态和可取消类型。
*可取消状态和可取消类型并没有包含在pthread_attr_t结构中。这两个属性影响线程在响应pthread_cancel函数调用时的行为。
*pthread_setcancelstate:改变可取消状态。可取消状态可以是PTHREAD_CANCEL_DISABLE或PTHREAD_CANCEL_ENABLE。线程启动时默认的可取消状态为PTHREAD_CANCEL_ENABLE。
*取消类型两种:延迟取消(PTHREAD_CANCEL_DEFERRED)和异步取消(PTHREAD_CANCEL_ASYNCHRONOUS)。默认的取消类型为延迟取消(PTHREAD_CANCEL_DEFERRED):调用pthread_cancel后,在线程到达取消点之前,并不会取消。取消点:线程检查是否被取消并按照请求进行动作的一个位置。某些函数在调用时,取消点都会出现,也可以调用pthread_testcancel自己添加取消点。异步取消:线程可以在任意时间取消,而不用非得遇到取消点才被取消。
*pthread_setcanceltype:设置取消类型。