Skip to content
This repository has been archived by the owner on Feb 1, 2022. It is now read-only.

Latest commit

 

History

History
138 lines (107 loc) · 4.72 KB

notes.md

File metadata and controls

138 lines (107 loc) · 4.72 KB

第12章 线程控制

章节目录 函数表


线程限制

为了增强应用程序在不同的操作系统实现之间的可移植性,SUS定义了一些与线程操作有关的限制:

限制名称描述name参数
PTHREAD_DESTRUCTOR_ITERATIONS 线程退出时操作系统实现试图销毁线程特定数据的最大次数。 _SC_THREAD_DESTRUCTOR_ITERATIONS
PTHREAD_KEYS_MAX 进程可以创建的键的最大数目。 _SC_THREAD_KEYS_MAX
PTHREAD_STACK_MIN 一个线程的栈可用的最小字节数 _SC_THREAD_STACK_MIN
PTHREAD_THREADS_MAX 进程可以创建的最大线程数 _SC_THREAD_THREADS_MAX

线程属性

pthread通过设置每个对象关联的不同属性来细调对象的行为。通常,管理这些属性的接口都遵循相同的模式:

  • 对象与它自己类型的属性对象进行关联。一个属性对象可以代表多个属性。属性对象对应用程序来说是不透明的。
  • 初始化函数:把属性对象设置为默认值。
  • 销毁函数:销毁属性对象,释放初始化函数申请的资源。
  • get函数:每个属性都有一个从属性对象中获取属性值的函数。
  • set函数:每个属性都有一个设置属性值的函数。

线程属性:pthread_attr_t

线程属性操作原语:

int pthread_attr_init(pthread_attr_t *attr);
功能初始化线程属性attr包含了操作系统实现支持的所有线程属性的默认值

int pthread_attr_destroy(pthread_attr_t *attr);
功能反初始化线程属性如果init有动态内存分配还会负责释放它们如果返回失败可能会有少量的内存泄漏并且没有任何的补救措施

线程属性对象支持的属性:

detachstate线程属性

分离线程:操作系统在线程退出时回收它所占用的资源,无法获取线程的退出状态。

int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
功能获取线程属性的分离状态属性int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
功能设置线程属性的分离状态属性PTHREAD_CREATE_DETACHED以分离状态启动线程
PTHREAD_CREATE_JOINABLE正常启动线程可以获取线程的终止状态

线程栈属性

线程栈属性分为栈的最低地址和栈的大小。

对于支持POSIX的系统来说,可能不支持栈属性。可在编译时测试宏_POSIX_THREAD_ATTR_STACKADDR和_POSIX_THREAD_ATTR_STACKSIZE。或运行时使用sysconf函数,_SC_THREAD_ATTR_STACKADDR、_SC_THREAD_ATTR_STACKSIZE。

int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
功能获取栈的最低地址和大小int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
功能设置栈的最低地址和大小1. stackaddr 是最低地址但不一定是开始地址2. 设置stackaddr属性会导致guardsize属性失效int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
功能获取栈的大小

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
功能设置栈的大小1. 只设置栈的大小可以不用自己处理栈的分配2. stacksize不能小于PTHREAD_STACK_MIN

guardsize线程属性

guardsize控制线程末尾之后用以避免栈溢出的扩展内存的大小

  • 默认值是系统页的大小
  • 可以设置为0
  • 如果修改了线程属性stackaddr,会使得此属性失效。
  • 修改guardsize,系统可能会取为页大小的整数倍。
  • 栈溢出到警戒区域时,会收到信号。
int pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize);
功能获取guardsize

int pthread_attr_setguardsize(const pthread_attr_t *attr, size_t guardsize);
功能设置guardsize系统可能会取为页大小的整数倍

章节目录 函数表