31.线程属性
可以在调用pthread_create之前为线程创建属性对象;
注意初始化属性对象后, 记得销毁属性对象.
32.pthread_attr_init
int pthread_attr_init(pthread_attr_t *tattr);
介绍:
将对象属性初始化为缺省值.
返回值:
成功返回0;
其他表示出错.
ENOMEM:内存不足.
示例:
pthread_attr_t attr;
int ret = pthread_attr_init(&attr);
缺省的线程属性如下:
scope PTHREAD_SCOPE_PROCESS 新线程和进程中的线程竞争
detach PTHREAD_CREATE_JOINABLE 线程退出后保留线程状态和ID
stackaddr NULL 系统分配的栈地址
stacksize 0 系统定义的栈大小
priority 0 新线程优先级为0
inherit PTHREAD_EXPLICIT_SCHED 新线程不继承父线程的调度优先级
schedpolicy SCHED_OTHER
33.pthread_attr_destroy
int pthread_attr_destroy(pthread_attr_t *tattr);
介绍:
销毁初始化时分配的存储空间.
返回值:
成功返回0;
其他表示出错.
34.pthread_attr_setdetachstate
int pthread_attr_setdetachstate(pthread_attr_t *tattr, int detachstate);
介绍:
非分离线程必须被join来释放该线程的资源.
分离线程一退出, 便可重用其线程ID和资源.
如果不需要等待线程退出, 请使用分离线程.
detachstate可以是PTHREAD_CREATE_DETACHED or PTHREAD_CREATE_JOINABLE.
返回值:
成功返回0;
其他表示出错.
示例:
ret = pthread_attr_init(&attr);
ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&tid, &attr, start_routine, arg);
35.pthread_attr_getdetachstate
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
介绍:
检查线程的创建状态.
返回值:
成功返回0;
其他表示出错.
EINVAL:detachstate为NULL or attr无效.
36.pthread_attr_setscope
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
介绍:
设置线程的争用范围:PTHREAD_SCOPE_SYSTEM(与系统中所有线程竞争) or PTHREAD_SCOPE_PROCESS(与进程中线程竞争).
返回值:
成功返回0;
其他表示出错.
37.pthread_attr_getscope
int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
介绍:
获得线程的争用范围.
返回值:
成功返回0;
其他表示出错.
38.pthread_setconcurrency
int pthread_setconcurrency(int new_level);
介绍:设置线程的并发级别.
39.pthread_getconcurrency
int pthread_getconcurrency();
介绍:获得线程的并发级别.
40.pthread_attr_setschedpolicy
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
介绍:设置线程的调度策略.
policy为SCHED_FIFO(先进先出), SCHED_RR(循环), SCHED_OTHER(其他).
返回值:
成功返回0;
其他表示出错.
41.pthread_attr_getschedpolicy
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
介绍:获得线程的调度策略.
policy为SCHED_FIFO(先进先出), SCHED_RR(循环), SCHED_OTHER(其他).
返回值:
成功返回0;
其他表示出错.
42.pthread_attr_setschedparam
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
介绍:
设置线程的优先级参数.
示例:
sched_param param;
param.sched_priority = 30;
int ret = pthread_attr_setschedparam(&attr, ¶m);
返回值:
成功返回0;
其他表示出错.
43.pthread_attr_getschedparam
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
介绍:
获得线程的优先级参数.
返回值:
成功返回0;
其他表示出错.
eg:
pthread_attr_t attr;
pthread_t tid;
int ret, newprio = 20;
struct sched_param param;
ret = pthread_attr_init(&attr);
ret = pthread_attr_getschedparam(&attr, ¶m);
param.sched_priority = newprio;
ret = pthread_attr_setschedparam(&attr, ¶m);
ret = pthread_create(&tid, &attr, func, arg);
44.pthread_attr_setstacksize
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t size);
介绍:
设置线程栈大小. size应该大于系统定义的最小栈PTHREAD_STACK_MIN大小.
size = 0 使用缺省大小.
返回值:
成功返回0;
其他表示出错.
EINALV:size小于PTHREAD_STACK_MIN or 超出系统限制 or attr无效.
45.pthread_attr_getstacksize
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *size);
介绍:
获得线程栈大小.
返回值:
成功返回0;
其他表示出错.
46.线程栈的相关介绍
线程栈是从页面边界开始的, 任何指定栈大小都会向上舍入到下一个页边界.
pthread_create创建线程时, 系统使用mmap的MAP_NORESERVE为每个线程栈分配虚拟内存, 但不保留任何交换空间.
系统将无效的内存页附加到线程栈的溢出端来捕捉栈溢出.访问此类内存页将导致内存访问故障SIGSEGV信号.
47.pthread_attr_setstack
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
介绍:
设置线程栈的地址和大小.
stackaddr定义线程栈的基准低地址, stacksize指定线程栈大小.
返回值:
成功返回0;
其他表示出错.
示例:
void *base = (void *)malloc(PTHREAD_STACK_MIN + 0x4000);
int ret = pthread_attr_setstack(&attr, base, PTHREAD_STACK_MIN + 0x4000);
48.pthread_attr_getstack
int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
介绍:
获得线程属性中线程栈地址和大小.
返回值:
成功返回0;
其他表示出错.
49.POSIX线程同步对象
互斥锁
条件变量
读写锁
信号
50.互斥锁
使用互斥锁可以确保一次只有一个线程执行代码的临界段.
51.pthread_mutexattr_init
int pthread_mutexattr_init(pthread_mutexattr_t *mattr);
介绍:
初始化互斥锁对象属性.
缺省的mutexattr为PTHREAD_PROCESS_PRIVATE, 对象分配类型为opaque由系统分配的属性对象.
返回值:
成功返回0;
其他表示出错.ENOMEM:内存不足, 无法初始化互斥锁属性对象.
示例:
pthread_mutexattr_t mattr;
int ret = pthread_mutexattr_init(&mattr);
52.pthread_mutexattr_destroy
int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr);
介绍:
销毁创建mutexattr初始化分配的内存
返回值:
成功返回0;
其他表示出错.
53.pthread_mutexattr_setpshared
int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared);
介绍:
设置互斥锁的作用域.
pshared可以是PTHREAD_PROCESS_PRIVATE(进程内专用锁) or PTHREAD_PROCESS_SHARED(系统范围内的锁, 在多个进程中的线程互斥, 可以用于共享内存).
返回值:
成功返回0;
其他表示出错.
54.pthread_mutexattr_getpshared
int pthread_mutexattr_getpshared(pthread_mutexattr_t *mattr, int *pshared);
介绍:
获得互斥锁范围.
返回值:
成功返回0;
其他表示出错.
55.pthread_mutexattr_settype
int pthread_mutexattr_settype(pthread_mutexattr_t *mattr, int type);
介绍:
设置锁的类型:
PTHREAD_MUTEX_NORMAL:不会检测死锁;
PTHREAD_MUTEX_ERRORCHECK:出错检测;
PTHREAD_MUTEX_RECURSIVE:递归锁;
PTHREAD_MUTEX_DEFAULT:不能递归锁定, 解锁非本线程锁定的锁将产生不确定行为.
返回值:
成功返回0;
其他表示出错.
56.pthread_mutexattr_gettype
int pthread_mutexattr_gettype(pthread_mutexattr_t *mattr, int *type);
介绍:
获得锁的类型.
返回值:
成功返回0;
其他表示出错.
57.pthread_mutexattr_setprotocol
int pthread_mutexattr_setprotocol(pthread_mutexattr_t *mattr, int protocol);
介绍:
设置锁的属性对象.
PTHREAD_PRIO_NONE:线程优先级和调度不受互斥锁拥有权的限制;
PTHREAD_PRIO_INHERIT
PTHREAD_PRIO_PROTECT
返回值:
成功返回0;
其他表示出错.
58.pthread_mutexattr_getprotocol
int pthread_mutexattr_getprotocol(pthread_mutexattr_t *mattr, int *protocol);
介绍:
获得锁的属性对象.
返回值:
成功返回0;
其他表示出错.
59.pthread_mutexattr_setprioceiling
int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *mattr, int prioceiling, int *oldceiling);
介绍:
设置互斥锁属性对象的优先级上限.
优先级上限定义执行临界区的优先级.
返回值:
成功返回0;
其他表示出错.
60.pthread_mutexattr_getprioceiling
int pthread_mutexattr_getprioceiling(pthread_mutexattr_t *mattr, int *prioceiling);
介绍:
获得互斥锁属性对象的优先级上限.
返回值:
成功返回0;
其他表示出错.