对于多线程编程的互斥锁和条件变量以及信号量的理解
2013-01-22 00:03
417 查看
对于多线程编程,我们有时候会遇到多个线程需要互斥访问同一个资源的问题,或者是线程间同步的问题,比如生存者和消费者,下面我就来讲讲多线程编程中的同步和互斥的问题。
1:互斥锁
当有一个链表,这个链表需要两个线程互斥访问时,我们就需要互斥锁。为什么呢?因为当一个线程要去使用这个链表时,首先他得先获得锁,一旦发现锁已经被别的线程占用,则无法获得锁将阻塞等待互斥锁被别人解锁,当然也有办法不阻塞,一旦无法获得锁,则直接返回。
如何初始化锁:
函数原型:
int pthread_mutex_init (pthread_mutex_t*mutex,constpthread_mutexattr_t* mutexattr);
函数传入值: mutex:互斥锁。
互斥锁有三种类型:
mutexattr:
PTHREAD_MUTEX_INITIALIZER 创建快速互斥锁。
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 创建递归互斥锁。
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP 创建检错互斥锁。
区别如下:
互斥量分为下面三种:
1、快速型。这种类型也是默认的类型。该线程的行为正如上面所说的。
2、递归型。如果遇到我们上面所提到的死锁情况,同一线程循环给互斥量上锁,那么系统将会知道该上锁行为来自同一线程,那么就会同意线程给该互斥量上锁。
3、错误检测型。如果该互斥量已经被上锁,那么后续的上锁将会失败而不会阻塞,pthread_mutex_lock()操作将会返回EDEADLK。
使用方式如下:
pthread_mutex_t mutex;
pthread_mutex_init (&mutex, NULL); /*定义*/
...
pthread_mutex_lock(&mutex); /*获取互斥锁*/
临界资源
pthread_mutex_unlock(&mutex); /*释放互斥锁*/
此时对锁的访问时阻塞的。所以这就会出现这么一个问题,当同一个线程已经获得这个锁,并且没有释放这个锁,如果他在申请锁,将造成死锁。所以对于同一个线程获取了锁,记得要释放。不要因为其他原因导致释放锁没有被执行,而再次去请求锁。
2:条件变量
1:互斥锁
当有一个链表,这个链表需要两个线程互斥访问时,我们就需要互斥锁。为什么呢?因为当一个线程要去使用这个链表时,首先他得先获得锁,一旦发现锁已经被别的线程占用,则无法获得锁将阻塞等待互斥锁被别人解锁,当然也有办法不阻塞,一旦无法获得锁,则直接返回。
如何初始化锁:
函数原型:
int pthread_mutex_init (pthread_mutex_t*mutex,constpthread_mutexattr_t* mutexattr);
函数传入值: mutex:互斥锁。
互斥锁有三种类型:
mutexattr:
PTHREAD_MUTEX_INITIALIZER 创建快速互斥锁。
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 创建递归互斥锁。
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP 创建检错互斥锁。
区别如下:
互斥量分为下面三种:
1、快速型。这种类型也是默认的类型。该线程的行为正如上面所说的。
2、递归型。如果遇到我们上面所提到的死锁情况,同一线程循环给互斥量上锁,那么系统将会知道该上锁行为来自同一线程,那么就会同意线程给该互斥量上锁。
3、错误检测型。如果该互斥量已经被上锁,那么后续的上锁将会失败而不会阻塞,pthread_mutex_lock()操作将会返回EDEADLK。
使用方式如下:
pthread_mutex_t mutex;
pthread_mutex_init (&mutex, NULL); /*定义*/
...
pthread_mutex_lock(&mutex); /*获取互斥锁*/
临界资源
pthread_mutex_unlock(&mutex); /*释放互斥锁*/
此时对锁的访问时阻塞的。所以这就会出现这么一个问题,当同一个线程已经获得这个锁,并且没有释放这个锁,如果他在申请锁,将造成死锁。所以对于同一个线程获取了锁,记得要释放。不要因为其他原因导致释放锁没有被执行,而再次去请求锁。
2:条件变量
相关文章推荐
- Linux下多线程编程之互斥锁、条件变量、信号量
- UCOS-II:对于信号量,互斥信号量,事件标志组的个人理解-转
- 多线程编程:深度理解 条件变量的激发与等待
- linux 多线程编程 之 信号量互斥同步
- UCOS-II:对于信号量,互斥信号量,事件标志组的个人理解
- UCOS-II:对于信号量,互斥信号量,事件标志组的个人理解
- Linux高级编程复习 第十二章 多线程概念_互斥锁--_多线程同步_信号_条件量_信号量
- UCOS2学习笔记:对于信号量,互斥信号量,事件标志组的个人理解
- 笔记:进程间通信——同步(互斥锁、读写锁、条件变量、信号量)以及Linux中的RCU
- 关于Socket的编程以及信号量的进一步理解
- linux多线程编程--信号量和条件变量 唤醒丢失事件
- 对于多线程的理解以及我们为什么要使用多线程
- 关于Socket的编程以及信号量的进一步理解
- 多线程编程:同时使用信号量与互斥锁
- linux 多线程编程 之 信号量互斥同步
- UCOS2:对于信号量,互斥信号量,事件标志组的个人理解
- UCOS2:对于信号量,互斥信号量,事件标志组的个人理解
- uCos-ii中对于信号量、互斥信号量、事件标志组的理解
- 多线程编程实例:不带缓冲的多线程文件复制(使用队列,互斥,条件变量)
- 【C语言基础一百题7】46-55题对于头文件和多文件编程的理解以及位运算