相关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.youkuaiyun.com/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