同步(一)互斥锁与条件变量
2013-05-09 18:56
260 查看
一 概述:
(1)互斥锁与条件变量的特点:
*互斥锁用于上锁,条件变量用于等待。
*互斥锁和条件变量可以用于线程或进程间的同步,是基于共享内存区。用于进程间同步时,需放置在多个进程的共享内存区中。
*互斥锁必须由给它上锁的线程解锁。
*任何时刻只有一个线程能够锁住一个给定的互斥锁。
*静态分配的互斥锁或条件变量具备默认属性,我们可以利用函数来以非默认属性初始化它们。
*编程技巧:把共享数据和它们的同步变量(互斥锁、条件变量或信号量)收集到一个结构。
二 互斥锁:用于上锁。
(1)互斥锁:相互排斥,最基本的同步形式。用于保护临界区(critical region),以保证任何时刻只有一个线程在执行其中的代码。
*通常轮廓:
lock_the_mutex(...)
临界区 //应该努力减少由一个互斥锁锁住的代码量。
unlock_the_mutex(...)
(2)互斥锁的初始化:
Posix互斥锁被声明为pthread_mutex_t数据类型的变量。
1.有两种初始化方式:
*如果互斥锁是静态分配的,可以把它初始化为常量:PTHREAD_MUTEX_INITIALIZER。
*如果互斥锁是动态分配的(例如通过malloc),或者分配在共享内存区中,那么必须在运行时通过调用pthread_mutex_init函数来初始化。通过动态分配可以指定进程间共享属性,从而允许在不同进程间共享某个互斥锁或条件变量,前提是互斥锁或条件变量必须放在这些进程的共享内存区中。
(3)上锁或解锁:
1.相关函数:
int pthread_mutex_lock(pthread_mutex_t *mptr);//已锁住,则阻塞
int pthread_mutex_trylock(pthread_mutex_t *mptr);//不阻塞
int pthread_mutex_unlock(pthread_mutex_t *mptr);
返回值:成功返回0;若出错则为正的Exxx值。
2.注意:
*如果尝试对一个已由另外某个线程锁住的互斥锁上锁,那么pthread_mutex_lock将阻塞到该互斥锁解锁位置。
*pthread_mutex_trylock:是对应的非阻塞函数,如果该互斥锁已锁住,它就返回一个EBUSY错误。
*如果多个线程阻塞在等待同一互斥锁解锁,那么解锁后将唤醒优先级最高的线程。(互斥锁、条件变量和信号量都一样).
三 条件变量:用于等待。
(1)条件变量特点:
*类型为pthread_cond_t。
*每个条件变量总是由一个互斥锁与之关联。
*静态分配的条件变量可以初始化为PTHREAD_COND_INITIALIZER。
*动态分配的条件变量和动态分配的互斥锁一样。可以使用相关函数初始化。
(2)相关函数:
int pthread_cond_wait(pthread_cond_t *cptr,pthread_mutex_t *mptr)
int pthread_cond_signal(pthread_cond_t *cptr)
int pthread_cond_broadcast(pthread_cond_t *cptr)
int pthread_cond_timedwait(pthread_cond_t *cptr,pthread_mutex_t *mptr,const struct timespec *abstime)
返回值:成功返回0;若出错则为正的Exxx值。
*注意:pthread_cond_wait原子地执行以下两个动作:给互斥锁解锁;把调用线程投入睡眠,直到另外某个线程就本条件变量调用pthread_cond_signal。pthread_cond_wait返回前重新给互斥锁上锁。
四 互斥锁和条件变量的属性
(1)互斥锁与条件变量的动态初始化和摧毁:
*int pthread_mutex_init(pthread_mutex_t *mptr,const pthread_mutexattr_t *attr)
*int pthread_mutex_destroy(pthread_mutex_t *mptr)
*int pthread_cond_init(pthread_cond_t *cptr,constr pthread_condattr_t *attr)
*int pthread_cond_destroy(pthread_cond_t *cptr)
返回值:成功返回0;若出错则为正的Exxx值。
其中mptr必须指向一个已分配的pthread_mutex_t变量,并由pthread_mutex_init函数初始化该锁.
attr指向的pthread_mutexattr_t值指定其属性,该参数为空,则是默认属性。
条件变量类似。
(2)互斥锁与条件变量的属性:
1.互斥锁的属性的数据类型为:pthread_mutexattr_t,条件变量的属性的数据类型为pthread_condattr_t。
2.属性的初始化和摧毁函数:
*int pthread_mutexattr_init(pthread_mutexattr_t *attr)
*int pthread_mutexattr_destroy(pthread_mutexattr_t *attr))
*int pthread_condattr_init(pthread_condattr_t *attr)
*int pthread_condattr_destroy(pthread_condattr_t *attr)
返回值:成功返回0;若出错则为正的Exxx值。
3.启用和禁止特定属性:
*一旦某个互斥锁或条件变量属性对象已被初始化,就可以调用不同函数启用或禁止特定的属性。
例如:指定互斥锁或条件变量在不同进程间共享的函数:
*int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr,int *valptr)
*int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,int value)
*int pthread_condattr_getpshared(const pthread_condattr_t *attr,int *valptr)
*int pthread_condattr_setpshared(pthread_condattr_t *attr,int value)
返回值:成功返回0;若出错则为正的Exxx值。
两个get函数返回由valptr指向的整数中的这个属性的值;两个value的值设定这个属性的值。
value值可以是PTHREAD_PROCESS_PRIVATE或PTHREAD_PROCESS_SHARED(进程间共享)。
(1)互斥锁与条件变量的特点:
*互斥锁用于上锁,条件变量用于等待。
*互斥锁和条件变量可以用于线程或进程间的同步,是基于共享内存区。用于进程间同步时,需放置在多个进程的共享内存区中。
*互斥锁必须由给它上锁的线程解锁。
*任何时刻只有一个线程能够锁住一个给定的互斥锁。
*静态分配的互斥锁或条件变量具备默认属性,我们可以利用函数来以非默认属性初始化它们。
*编程技巧:把共享数据和它们的同步变量(互斥锁、条件变量或信号量)收集到一个结构。
二 互斥锁:用于上锁。
(1)互斥锁:相互排斥,最基本的同步形式。用于保护临界区(critical region),以保证任何时刻只有一个线程在执行其中的代码。
*通常轮廓:
lock_the_mutex(...)
临界区 //应该努力减少由一个互斥锁锁住的代码量。
unlock_the_mutex(...)
(2)互斥锁的初始化:
Posix互斥锁被声明为pthread_mutex_t数据类型的变量。
1.有两种初始化方式:
*如果互斥锁是静态分配的,可以把它初始化为常量:PTHREAD_MUTEX_INITIALIZER。
*如果互斥锁是动态分配的(例如通过malloc),或者分配在共享内存区中,那么必须在运行时通过调用pthread_mutex_init函数来初始化。通过动态分配可以指定进程间共享属性,从而允许在不同进程间共享某个互斥锁或条件变量,前提是互斥锁或条件变量必须放在这些进程的共享内存区中。
(3)上锁或解锁:
1.相关函数:
int pthread_mutex_lock(pthread_mutex_t *mptr);//已锁住,则阻塞
int pthread_mutex_trylock(pthread_mutex_t *mptr);//不阻塞
int pthread_mutex_unlock(pthread_mutex_t *mptr);
返回值:成功返回0;若出错则为正的Exxx值。
2.注意:
*如果尝试对一个已由另外某个线程锁住的互斥锁上锁,那么pthread_mutex_lock将阻塞到该互斥锁解锁位置。
*pthread_mutex_trylock:是对应的非阻塞函数,如果该互斥锁已锁住,它就返回一个EBUSY错误。
*如果多个线程阻塞在等待同一互斥锁解锁,那么解锁后将唤醒优先级最高的线程。(互斥锁、条件变量和信号量都一样).
三 条件变量:用于等待。
(1)条件变量特点:
*类型为pthread_cond_t。
*每个条件变量总是由一个互斥锁与之关联。
*静态分配的条件变量可以初始化为PTHREAD_COND_INITIALIZER。
*动态分配的条件变量和动态分配的互斥锁一样。可以使用相关函数初始化。
(2)相关函数:
int pthread_cond_wait(pthread_cond_t *cptr,pthread_mutex_t *mptr)
int pthread_cond_signal(pthread_cond_t *cptr)
int pthread_cond_broadcast(pthread_cond_t *cptr)
int pthread_cond_timedwait(pthread_cond_t *cptr,pthread_mutex_t *mptr,const struct timespec *abstime)
返回值:成功返回0;若出错则为正的Exxx值。
*注意:pthread_cond_wait原子地执行以下两个动作:给互斥锁解锁;把调用线程投入睡眠,直到另外某个线程就本条件变量调用pthread_cond_signal。pthread_cond_wait返回前重新给互斥锁上锁。
四 互斥锁和条件变量的属性
(1)互斥锁与条件变量的动态初始化和摧毁:
*int pthread_mutex_init(pthread_mutex_t *mptr,const pthread_mutexattr_t *attr)
*int pthread_mutex_destroy(pthread_mutex_t *mptr)
*int pthread_cond_init(pthread_cond_t *cptr,constr pthread_condattr_t *attr)
*int pthread_cond_destroy(pthread_cond_t *cptr)
返回值:成功返回0;若出错则为正的Exxx值。
其中mptr必须指向一个已分配的pthread_mutex_t变量,并由pthread_mutex_init函数初始化该锁.
attr指向的pthread_mutexattr_t值指定其属性,该参数为空,则是默认属性。
条件变量类似。
(2)互斥锁与条件变量的属性:
1.互斥锁的属性的数据类型为:pthread_mutexattr_t,条件变量的属性的数据类型为pthread_condattr_t。
2.属性的初始化和摧毁函数:
*int pthread_mutexattr_init(pthread_mutexattr_t *attr)
*int pthread_mutexattr_destroy(pthread_mutexattr_t *attr))
*int pthread_condattr_init(pthread_condattr_t *attr)
*int pthread_condattr_destroy(pthread_condattr_t *attr)
返回值:成功返回0;若出错则为正的Exxx值。
3.启用和禁止特定属性:
*一旦某个互斥锁或条件变量属性对象已被初始化,就可以调用不同函数启用或禁止特定的属性。
例如:指定互斥锁或条件变量在不同进程间共享的函数:
*int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr,int *valptr)
*int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,int value)
*int pthread_condattr_getpshared(const pthread_condattr_t *attr,int *valptr)
*int pthread_condattr_setpshared(pthread_condattr_t *attr,int value)
返回值:成功返回0;若出错则为正的Exxx值。
两个get函数返回由valptr指向的整数中的这个属性的值;两个value的值设定这个属性的值。
value值可以是PTHREAD_PROCESS_PRIVATE或PTHREAD_PROCESS_SHARED(进程间共享)。
相关文章推荐
- 线程互斥与同步(part2)—互斥锁(Mutex)的“cp”:条件变量(Condition Variable)
- python多线程编程(5): 条件变量同步
- Linux C 多线程编程 -- 互斥锁与条件变量
- linux多线程-互斥&条件变量与同步
- 互斥锁和条件变量
- 线程同步:何时互斥锁不够,还需要条件变量?
- 再谈互斥锁与条件变量!
- boost c++ lib on linux(4) - thread同步条件变量学习——生产者消费者队列
- python多线程编程(4): 条件变量同步
- 线程间使用条件变量同步正确方式
- Linux多线程 互斥锁与条件变量使用
- 线程同步:何时互斥锁不够,还需要条件变量?
- 互斥锁与条件变量及生产者-消费者问题
- 再谈互斥锁与条件变量!
- 互斥锁与条件变量
- Linux C 多线程编程之互斥锁与条件变量
- 互斥锁和条件变量
- Linux多线程编程(二)线程同步之条件变量
- go语言同步教程之条件变量
- 利用条件变量和互斥锁实现读写锁