1、Unix线程可以使用的同步方法
#1 互斥量(Mutex)
#2 条件变量
#3 读写锁
#4 信号量(semaphore)
2、互斥量
#1 保证同一时间只有一个线程访问数据
#2 本质上讲,互斥量是一把锁,在访问共享资源之前加锁,访问完毕后释放锁
##1 创建互斥锁
静态方式:pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
动态方式:采用pthread_mutex_init()来初始化互斥锁
##2 注销一个互斥锁
pthread_mutex_destroy()
##3 动态初始化Mutex
@1 定义mutexattr对象:pthread_mutexattr_t mutexattr;
@2 对mutexattr对象初始化:pthread_mutextattr_init()
@3 对mutexattr对象进行修改:
pthread_mutexattr_setprioceiling()
pthread_mutexattr_setprotocol()
pthread_mutexattr_setpshared()
pthread_mutexattr_settype()
@4 调用pthread_mutex_init(),使用mutexattr作为属性参数
pthread_mutex_init(&mutex, &mutexattr)
@5 销毁mutexattr对象
pthread_mutexattr_destroy()
##4 锁操作主要包括:
@1 加锁:pthread_mutex_lock()
@2 解锁:pthread_mutex_unlock()
@3 测试加锁:pthread_mutex_trylock()
Note:
@1 POSIX线程锁机制的Linux实现都不是取消点,因此,延迟取消类型的线程不会因收到取消信号而离开加锁等待
@2 若线程在lock后unlock前被取消,锁将永远保持锁定状态,因此,如果在关键区段内cancel point存在,或者设置了异步取消类型,则必须在退出回调函数中unlock
@3 锁机制不是异步信号安全的,即不应该在信号处理过程中使用Mutex,否则容易造成死锁
3、条件变量
条件变量是利用线程间共享全局变量进行同步的一种机制,主要包括两个动作:
@1 一个线程等待“条件变量的条件成立”而挂起
@2 另一个线程使“条件成立”(给出条件成立信号)
为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起
#1 条件变量的创建
##1 静态方式:pthread_cond_t cond=PTHREAD_COND_INITIALIZER
##2 动态方式:pthread_cond_init()
#2 条件变量的等待
##1 无条件等待:pthread_cond_wait()
##2 计时等待:pthread_cond_timewait()
#3 唤醒其他等待的线程,触发条件有两种:
##1 pthread_cond_signal()激活一个等待该条件的线程,存在多个等待线程时,按入对顺序激活其中的一个
##2 pthread_cond_broadcast()则激活所有等待线程
4、读写锁(共享-独占锁)
一次只有一个线程可占有写模式的读写锁,但是可有多个线程同时占有读模式的读写锁
#1 读写锁的创建与销毁
pthread_rwlock_init()
pthread_rwlock_destroy()
#3 读写锁的操作
pthread_rwlock_rdlock()
pthread_rwlock_tryrdlock()
pthread_rwlock_wrlock()
pthread_rwlock_trywrlock()
pthread_rwlock_unlock()
阅读(1824) | 评论(0) | 转发(2) |