1. 读写锁
读写锁与互斥量类似,不过读写锁允许更高的并行性。互斥量只有两种状态,加锁或者不加锁,而且只允许一个线程对其加锁;而读写锁有三种状态:读模式加锁,写模式加锁,不加锁。写模式下一次只有一个线程可以拥有读写锁,而在读模式下,多个线程可以同时占有读写锁。
注意:
- 在写模式下,在锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞。
- 在读模式下,所有试图对其加锁的线程都会得到访问权,
- 在都模式下,有另外的锁试图已写模式加锁,则随后的读模式锁请求将会被阻塞,这样是为了避免读模式长时间存在,而写模式得不到满足。
2. 进程属性
下面的两个函数可以管理线程属性:
#include <pthread.h>
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);
setstack函数用来改变新建线程的栈位置,getstack函数返回线程栈的地址。
线程的其他属性:
- 可取消状态
- 可取消类型
- 并发度
3. 同步属性
3.1 互斥量属性
pthread_mutexattr_init用默认的互斥量属性初始化pthread_mutexattr_t结构。要注意的是进程属性和类型属性,可以用下面的函数修改进程属性:
#include <pthread.h>
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *
restrict attr, int *restrict pshared);
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,
int pshared);
类型互斥量决定着互斥量的特性,POSIX.1定义了四种类型,如下:
用下面的函数,可以获得/修改互斥量类型属性:
#include <pthread.h>
int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict attr,
int *restrict type);
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
3.2 读写锁&条件变量属性
读写锁唯一支持的是进程共享属性,与互斥量的进程共享属性一样。
条件变量也支持进程共享属性。
4. 线程私有数据
首先用下面的函数创建一个键用来获取线程私有数据的访问权:
#include <pthread.h>
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
创建的键存放在key指向的内存单元,这个键可以被进程中所有的线程使用。当然也可以用下面的函数取消键与线程私有数据之间的关联联系:
#include <pthread.h>
int pthread_key_delete(pthread_key_t key);