惊群效应
- 多线程在同时等待(堵塞)一件事件发生(线程睡眠),当事件发生时会唤醒所有线程。但只有一个线程能拿到控制权,处理这一事件
虚假唤醒
- 当线程被唤醒,但没有足够资源或者资源被其他线程占用使用或销毁,
- 也就是,当线程被唤醒,但是没有足够的资源让它去执行事件
为何用while?
pthread_mutex_lock(&work->mutex);
if(ac.empty())
pthread_cond_wait(&work->mutex,&work->cond);
ac.pop_back();
对于变量锁,有可能在同一时间进行if判断,同时满足条件。而后进入阻塞等待,当出现惊群现象后。ac可能被某个线程出栈为空,但这时又有一个线程获得锁,继续对ac进行操作。
pthread_mutex_lock(&work->mutex);
while(ac.empty()){
pthread_cond_wait(&work->mutex,&work->cond);
}
ac.pop_back();
而使用while 循环,当线程获得锁后会再次对条件进行判断,从而避免线程被唤醒后没足够资源进行操作的情况。