APUE学习笔记-线程控制

前面一章讲了线程以及线程同步的基础知识。本章讲解控制线程行为方面的内容,介绍线程属性和同步原语属性。

1.线程限制

如下总结了一些限制:

  • PTHREAD_DESTRUCTOR_ITERATIONS:线程退出时操作系统实现试图销毁线程特定数据的最大次数。
  • PTHREAD_KEYS_MAX:进程可以创建的键的最大数目。
  • PTHREAD_STACK_MIN:一个线程的栈可用的最小字节数。
  • PTHREAD_THREADS_MAX:进程可以创建的最大线程数。
2.线程属性

(1)在pthread_create函数中,可以使用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来。可以使用pthread_attr_init函数初始化pthread_attr_t结构。

如果要反初始化pthread_attr_t结构,可以调用pthread_attr_destroy函数。

(2)如下总结了POSIX.1线程属性:

  • detachstate:线程的分离状态属性
  • guardsize:线程栈末尾的警戒缓冲区大小(字节数)
  • stackaddr:线程栈的最低地址
  • stacksize:线程栈的最小长度(字节数)

1)如果在创建线程时就知道不需要了解线程的终止状态,就可以修改pthread_attr_t结构中的detachstate线程属性,让线程一开始就处于分离状态。可以使用pthread_attr_setdetachstate函数把线程属性detachstate设置成一下两个合法值之一:PTHREAD_CREATE_DETACHED,以分离状态启动线程;或者PTHREAD_CREATE_JOINABLE,正常启动线程,应用程序可以获取线程的终止状态。

可以调用pthread_attr_getdetachstate函数获取当前的detachstate线程属性。

2)可以使用函数pthread_attr_getstackpthread_attr_setstack对线程栈属性进行管理。

3)应用程序也可以通过pthread_attr_getstacksizepthread_attr_setstacksize函数读取或设置线程属性stacksize。

3.同步属性

就像线程具有属性一样,线程的同步对象也有属性。

(1)互斥量属性

1)对于非默认属性,可以用pthread_mutexattr_init初始化pthread_mutexattr_t结构,用pthread_mutexattr_destroy来反初始化。

2)使用pthread_mutexattr_getpshared函数查询pthread_mutexattr_t结构,得到它的进程共享属性,使用pthread_mutexattr_setpshared函数修改进程共享属性。

3)可以使用pthread_mutexattr_getrobust函数获取健壮的互斥量属性的值。可以调用pthread_mutexattr_setrobust函数设置健壮的互斥量属性的值。

4)pthread_mutexattr_gettype函数得到互斥量类型属性 pthread_mutexattr_settype函数修改互斥量类型属性。

(2)读写锁属性

1)可以用pthread_rwlockattr_init初始化pthread_rwlockattr_t结构,用pthread_rwlockattr_destroy反初始化该结构。

2)读写锁支持的唯一属性是进程共享属性。它与互斥量的进程共享属性是相同的。就像互斥量的进程共享属性一样,有一对函数用于读取和设置读写锁的进程共享属性。

(3)条件变量属性

1)Single UNIX Specificaion目前定义了条件变量的两个属性:进程共享属性和时钟属性。如下一对函数用于初始化和反初始化条件变量属性。

2)条件变量支持进程共享属性,它控制着条件变量是可以被单进程的多个线程使用,还是可以被多进程的线程使用。要获取进程共享属性的当前值,可以用pthread_condattr_getpshared函数。设置该值可以用pthread_condattr_setpshared函数。

3)使用pthread_condattr_getclock函数获取可被用于pthread_cond_timedwait函数的时钟ID,使用pthread_condattr_setclock函数对时钟ID进行修改。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注