最近在看等待队列,发现void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key)每执行一次只能唤醒等待队列中的一个线程?能不能一次性唤醒等待队列中的所有线程?
还有想请教一下waitqueue的用法
如果一个waitqueue队列被唤醒了,还能不能再在这个队列中在添加等待线程?
static struct rt_wqueue _wait_queue = {0};
void thread1 (void *p) //线程1
{
rt_wqueue_wait(&_wait_queue, 0, RT_WAITING_FOREVER);
}
void thread2(void *p) //线程2
{
rt_wqueue_wait(&_wait_queue, 0, RT_WAITING_FOREVER);
}
void wqueue_test(void) //唤醒线程
{
rt_wqueue_init(&_wait_queue);
rt_wqueue_wakeup(&_wait_queue, 0);
}
比如上面的代码,线程1和线程2都被加入到了等待队列,唤醒线程 wqueue_test去执行rt_wqueue_wakeup函数唤醒这个队列_wait_queue。
rt_wqueue_wakeup()是不是把_wait_queue队列中每个等待线程都唤醒了还是只唤醒一个等待线程。
另外,当_wait_queue被执行了唤醒,这个_wait_queue队列还能继续添加线程进去被等待吗,
也就是执行了rt_wqueue_wakeup(&_wait_queue, 0)这个函数后能不能接着有其他线程继续执行 rt_wqueue_wait(&_wait_queue, 0, RT_WAITING_FOREVER)把自己挂到这个等待队列中去,等待下一次被rt_wqueue_wakeup唤醒?