多线程学习之锁和事件

来源:互联网 发布:脆弱的变化知乎 编辑:程序博客网 时间: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
原创粉丝点击