APUE读书笔记(19) 线程控制(上)

第十二章 线程控制

一:线程限制:
  Single Unix定义了一线线程操作的限制,和其他的限制一样,可以通过sysconf来查询。和其它的限制使用目的一样,为了应用程序的在不同操作 系统的可移植性。 一些限制:
  PTHREAD_DESTRUCTOR_ITERATIONS: 销毁一个线程数据最大的尝试次数,可以通过_SC_THREAD_DESTRUCTOR_ITERATIONS作为sysconf的参数查询。
  PTHREAD_KEYS_MAX: 一个进程可以创建的最大key的数量。可以通过_SC_THREAD_KEYS_MAX参数查询。
  PTHREAD_STACK_MIN: 线程可以使用的最小的栈空间大小。可以通过_SC_THREAD_STACK_MIN参数查询。
  PTHREAD_THREADS_MAX:一个进程可以创建的最大的线程数。可以通过_SC_THREAD_THREADS_MAX参数查询
二:线程属性
  在调用pthread_create函数创建一个新线程时候可以指定线程的属性,属性类型为pthread_attr_t,该结构对应用程序是不透明,操作函数如下:
  int pthread_attr_init(pthread_attr_t *attr); //初始化线程属性
  int pthread_attr_destroy(pthread_attr_t *attr); //释放线程属性空间
  线程属性主要有:
  (1)线程的分离状态属性detachstate
  (2)线程栈末尾的警戒缓冲区大小guardsize
  (3)线程栈的最低地址statckaddr
  (4)线程栈的大小stacksize。
  如果对现有某个线程的终止状态不感兴趣的话,可以使用pthread_detach函数让操作系统在线程退出时候收回它所占用的资源。创建线程时候可以修改pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。可以使用下面函数进程操作分离属性:
  int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
  int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
  detatchstate取值为:
  (1)PTHREAD_CREATE_DETACHED 分离状态启动
  (2)PTHREAD_CREATE_JOINABLE 正常启动,应用程序可以获取线程的终止状态。
  线程栈属性操作函数:
  int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize);
  int pthread_attr_getstack(pthread_attr_t *attr,void **stackaddr, size_t *stacksize);
  int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
  int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
  int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
  int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
三:同步属性
  初始化和销毁互斥量属性:
APUE读书笔记(19) 线程控制(上)_第1张图片
  互斥量具有一些属性,通过修改这些属性可以控制锁的一些行为。缺省的互斥锁属性及其值如下:
  pshared: PTHREAD_PROCESS_PRIVATE
  type: PTHREAD_MUTEX_DEFAULT
  protocol: PTHREAD_PRIO_NONE
  prioceiling: –
  robustness: PTHREAD_MUTEX_STALLED_NP
  读写锁也有属性,使用pthread_rwlockattr_init初始化pthread_rwlockattr_t结构,用pthread_rwlockattr_destroy回收结构。
在这里插入图片描述
读写锁支持的唯一属性是进程共享属性,该属性与互斥量的进程共享属性相同,就像互斥量的进程共享属性一样。用一对函数
来读取和设置读写锁的进程属性。
APUE读书笔记(19) 线程控制(上)_第2张图片
  条件变量属性,初始化和销毁:
APUE读书笔记(19) 线程控制(上)_第3张图片
  get和set
APUE读书笔记(19) 线程控制(上)_第4张图片
  屏障属性
在这里插入图片描述
  get和set
APUE读书笔记(19) 线程控制(上)_第5张图片
五:重入
  有了信号处理程序和多线程,多个控制线程在同一时间可能潜在的调用同一个函数,如果一个函数在同一时刻可以被多个线程安全调用,则称为函数是线程安全的。很多函数并不是线程安全的,因为它们返回的数据是存放在静态的内存缓冲区,可以通过修改接口,要求调用者自己提供缓冲区使函数变为线程安全的。POSIX.1提供了以安全的方式管理FILE对象的方法,使用flockfile和ftrylockfile获取与给定FILE对象关联的锁。这个锁是递归锁。函数原型如下:
  void flockfile(FILE *filehandle);
  int ftrylockfile(FILE *filehandle);
  void funlockfile(FILE *filehandle);
  为了避免标准I/O在一次一个字符操作时候频繁的获取锁开销,出现了不加锁版本的基于字符的标准I/O例程。函数如下:
  int getc_unlocked(FILE *stream);
  int getchar_unlocked(void);
  int putc_unlocked(int c, FILE *stream);
  int putchar_unlocked(int c);

你可能感兴趣的:(APUE)