多线程学习之锁和事件
来源:互联网 发布:脆弱的变化知乎 编辑:程序博客网 时间:2024/06/06 00:44
相关API:
pthread_cond_signal/SetEvent
pthread_cond_wait/WaitForSingleObject
0) windows上叫做事件Event,Linux上叫做条件变量cond
1) 事件的状态分为有信号(signaled)和无信号(unsignaled),有时也成为置位和重置
2) 当事件unsignaled时,wait会阻塞直到事件signaled
3) 当事件signaled时,wait才会返回
当事件从unsignaled->signaled时,wait返回,此时的附带行为会有所不同
分3类说明:
1. Windows下auto set event
1) 如果此时有多个线程正在WaitForSingleObject这个event,那么只有其中一个线程能够成功返回,并且使得这个event变为unsignaled,其他线程继续阻塞
2) 如果当前没有线程在等待,其状态会保持为置位(signaled)
2. Windows下manual event
1) 当一个事件是手动重置事件,事件被触发后,所有等待的线程都会变成可调度状态,该事件在触发后一直为触发状态,直到手动重置该事件为未触发状态
3. linux下的signal/wait
1) 当条件变量置位(signaled)以后,即使当前没有任何线程在等待,其状态也会恢复为复位(unsignaled)状态
2) 使用pthread_cond_signal一般不会有“惊群现象”产生,他最多只给一个线程发信号
一般来讲,linux下使用条件变量需要用到mutex,即:
Pthread_mutex_lock()
/* In any waiting thread: */while(!buf->full) // 防止虚假唤醒 Spurious_wakeup wait(&buf->cond, &buf->lock); /* In any other thread: */if(buf->n >= buf->size){ buf->full = 1; signal(&buf->cond);}
Pthread_mutex_unlock()
http://blog.csdn.net/anonymalias/article/details/9093733
http://www.eefocus.com/andrew_dj/blog/12-08/282740_85e58.html
http://www.cnblogs.com/magic-house/archive/2013/03/08/2949137.html
http://software.intel.com/zh-cn/blogs/2011/03/24/linux-windows
- 多线程学习之锁和事件
- C++ 多线程之临界区和事件
- 多线程开发学习笔记之线程同步——事件
- C#多线程和事件
- C#多线程之同步事件和等待句柄
- [iOS学习]多线程之NSOperation和GCD
- java多线程学习之——多线程中几种释放锁和不释放锁的操作
- WPF学习之【事件,命令和设置】
- DOM学习之事件处理和事件对象
- JavaScript学习笔记之事件冒泡和事件捕获
- 多线程编程之事件同步
- Qt学习系列之四:多线程及通过事件进行通信
- Java学习---多线程之锁机制
- ios多线程学习之GCD线程锁
- 多线程学习之四
- java--------学习之《多线程》
- java学习之---多线程
- java之学习多线程
- Servlet采用forward出现中文乱码问题解决
- 宏的妙用
- spring之事务管理
- Python 常见的17个错误分析
- Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2所需要的jar包总结
- 多线程学习之锁和事件
- 2013 number line of code
- OpenSSl---安装
- 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件
- order by 小结
- Spring之openSessionInViewFilter
- 【LeetCode】Search in Rotated Sorted Array
- c语言程序
- JSTL 显示问题