线程的三种同步机制
2013-04-17 12:18
281 查看
线程的三种同步机制:
互斥:
变量名为:
pthread_mutex_t
初始化与销毁:
如果是静态分配的互斥量,可以设置为常量 PTHREAD_MUTEX_INITIALIZER
如果是动态分配的互斥量,则在销毁内存之前要调用pthread_mutex_destroy
int pthread_mutex_init(pthread_mutex_t *, NULL);
第二个参数null表示选择默认设置。
int pthread_mutex_destroy(pthread_mutex_t* mutex);
函数成功返回0, 否则返回错误编号。
上锁与解锁:
int pthread_mutex_lock(pthread_mutex_t* );
int pthread_mutex_unlock(pthread_mutex_t*);
int pthread_mutex_trylock(pthread_mutex_t*);
第三个函数有点特殊,它尝试对互斥量加锁,如果不成功,返回EBUSY, 线程不会阻塞。
书上的代码是错的。。。囧
读写锁
又叫共享-独占锁。读写锁适用与对数据的读取大于写入的场合。读写锁允许同时有多个线程读取数据,但只能有一个线程写入数据。
当读写锁处于读模式锁住时,如果有线程试图以写模式加锁,则读写锁会阻塞随后的读模式锁请求
变量:
pthread_rwlock_t
初始化与销毁:
int pthread_rwlock_init(pthread_rwlock_t *);
int pthread_rwlock_destroy(pthread_rwlock_t *);
加锁与解锁:
int pthread_rwlock_rdlock(pthread_rwlock_t *);
int pthread_rwlock_wrlock(pthread_rwlock_t *);
int pthread_rwlock_unlock(pthread_unlock);
读写模式的加锁请求调用不同的函数,解锁调用相同的函数。
在读模式下,解锁时对引用计数减一,如果减到0,则解锁
在写模式下,解锁时饮用计数会减到0,所以直接解锁
因此不用区分两种解锁方式,用相同的函数即可。
同样有try版本:
int pthread_rwlock_tryrdlock(pthread_rwlock_t *);
int pthread_rwlock_trywrlock(pthread_rwlock_t*);
条件变量:
条件变量需要与互斥量配合使用。
条件变量等待某个条件的发生,而互斥量用于锁住线程进入和推出队列的时间空隙,使得条件变量不会错过条件的变化。
变量名:
pthread_cond_t
初始化与销毁:
静态初始化变量: PTHREAD_COND_INITIALIZER
int pthread_cond_init(pthread_cond_t * , NULL);
int pthread_cond_destroy(pthread_cond_t*);
wait:
int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t*);
int pthread_cont_timedwait(pthread_cond_t*, pthread_mutex_t*, timespec* timeout);
第二个函数多了设置等待时间的参数
在使用wait函数时, 首先要对 mutex加锁。
然后调用wait函数。 wait函数会先将线程放到等待队列上,然后将mutex解锁。
如果在等待时间内,没有等到条件发生,wait函数会先对mutex加锁,再将线程推出等待队列。
通知函数:
int pthread_cond_signal (pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t* cond);
互斥:
变量名为:
pthread_mutex_t
初始化与销毁:
如果是静态分配的互斥量,可以设置为常量 PTHREAD_MUTEX_INITIALIZER
如果是动态分配的互斥量,则在销毁内存之前要调用pthread_mutex_destroy
int pthread_mutex_init(pthread_mutex_t *, NULL);
第二个参数null表示选择默认设置。
int pthread_mutex_destroy(pthread_mutex_t* mutex);
函数成功返回0, 否则返回错误编号。
上锁与解锁:
int pthread_mutex_lock(pthread_mutex_t* );
int pthread_mutex_unlock(pthread_mutex_t*);
int pthread_mutex_trylock(pthread_mutex_t*);
第三个函数有点特殊,它尝试对互斥量加锁,如果不成功,返回EBUSY, 线程不会阻塞。
书上的代码是错的。。。囧
读写锁
又叫共享-独占锁。读写锁适用与对数据的读取大于写入的场合。读写锁允许同时有多个线程读取数据,但只能有一个线程写入数据。
当读写锁处于读模式锁住时,如果有线程试图以写模式加锁,则读写锁会阻塞随后的读模式锁请求
变量:
pthread_rwlock_t
初始化与销毁:
int pthread_rwlock_init(pthread_rwlock_t *);
int pthread_rwlock_destroy(pthread_rwlock_t *);
加锁与解锁:
int pthread_rwlock_rdlock(pthread_rwlock_t *);
int pthread_rwlock_wrlock(pthread_rwlock_t *);
int pthread_rwlock_unlock(pthread_unlock);
读写模式的加锁请求调用不同的函数,解锁调用相同的函数。
在读模式下,解锁时对引用计数减一,如果减到0,则解锁
在写模式下,解锁时饮用计数会减到0,所以直接解锁
因此不用区分两种解锁方式,用相同的函数即可。
同样有try版本:
int pthread_rwlock_tryrdlock(pthread_rwlock_t *);
int pthread_rwlock_trywrlock(pthread_rwlock_t*);
条件变量:
条件变量需要与互斥量配合使用。
条件变量等待某个条件的发生,而互斥量用于锁住线程进入和推出队列的时间空隙,使得条件变量不会错过条件的变化。
变量名:
pthread_cond_t
初始化与销毁:
静态初始化变量: PTHREAD_COND_INITIALIZER
int pthread_cond_init(pthread_cond_t * , NULL);
int pthread_cond_destroy(pthread_cond_t*);
wait:
int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t*);
int pthread_cont_timedwait(pthread_cond_t*, pthread_mutex_t*, timespec* timeout);
第二个函数多了设置等待时间的参数
在使用wait函数时, 首先要对 mutex加锁。
然后调用wait函数。 wait函数会先将线程放到等待队列上,然后将mutex解锁。
如果在等待时间内,没有等到条件发生,wait函数会先对mutex加锁,再将线程推出等待队列。
通知函数:
int pthread_cond_signal (pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t* cond);
相关文章推荐
- 进程/线程 同步机制
- [Andriod]计时器实现-基于线程消息机制三种方式
- JAVA线程同步锁机制分析
- 心得3--由售票系统中的抢票机制解说同步线程及死锁案例分析
- 线程的同步、互斥机制
- 线程通知MFC多线程程序的同步机制
- java线程同步机制
- Java线程同步机制深刻阐述
- Day19—线程的基本操作、线程的同步机制
- JVM线程资源同步及交互机制
- java如何实现线程的安全:线程的同步机制
- 线程间同步机制02_互斥锁
- 心得3--由售票系统中的抢票机制解说同步线程及死锁案例分析
- 浅析线程的同步与互斥机制
- Java实例说明 100个线程同时向一个银行账户中存入1元钱,在没有使用同步机制和使用同步机制情况下的执行情况
- Java synchronized同步线程机制(二)
- Java线程同步机制深入阐述
- 线程的同步机制
- 线程/进程同步的方式和机制
- 专业课程设计之客户与服务器程序的同步与通信机制的设计(三)数据共享和线程