基因数据库网站建设,什么是专门型的网站,动漫设计培训学校,松江建设新城有限公司网站为什么会有虚假唤醒一说。Linux内核这么强大#xff0c;怎么会出现这样的情况#xff1f;一直以来也很困惑#xff0c;看了下文链接中的介绍后#xff0c;豁然开朗。
从计算机设计的角度#xff0c;如果一层解决不了#xff0c;那就再多加一层。推算到这里#xff0c;就…为什么会有虚假唤醒一说。Linux内核这么强大怎么会出现这样的情况一直以来也很困惑看了下文链接中的介绍后豁然开朗。
从计算机设计的角度如果一层解决不了那就再多加一层。推算到这里就是在表层看不明白时就需要更深入一层看它的实现逻辑是怎么样的。
伪代码实现
以下代码来自pthread_cond_broadcast的man page
pthread_cond_wait(mutex, cond)
{value cond-value; /* 1 */pthread_mutex_unlock(mutex); /* 2 */pthread_mutex_lock(cond-mutex); /* 10 */if (value cond-value) { /* 11 */me-next_cond cond-waiter;cond-waiter me;pthread_mutex_unlock(cond-mutex);unable_to_run(me);} else {pthread_mutex_unlock(cond-mutex); /* 12 */}pthread_mutex_lock(mutex); /* 13 */
}pthread_cond_signal(cond)
{pthread_mutex_lock(cond-mutex); /* 3 */cond-value; /* 4 */if (cond-waiter) { /* 5 */sleeper cond-waiter; /* 6 */cond-waiter sleeper-next_cond; /* 7 */able_to_run(sleeper); /* 8 */}pthread_mutex_unlock(cond-mutex); /* 9 */
}
原因分析
按照伪代码实现中的情况我们同时调用pthread_cond_wait、pthread_cond_signal时并不一定能直接执行到序号11导致该睡眠的线程不睡眠而是有可能运行到序号3到9之后才能到序号10。
假设A线程调用pthread_cond_waitB线程调用pthread_cond_signal。从表现上看是A线程没有睡眠B线程直接唤起了更早就再在等待的线程比如线程C
参考链接
pthread_cond_broadcast(3p) - Linux manual page (man7.org)深入理解条件变量(虚假唤醒)_条件变量虚假唤醒详解博客园-CSDN博客