gpt4 book ai didi

c - 条件变量有队列吗?

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:56 25 4
gpt4 key购买 nike

我正在实现条件变量的等待操作。我的条件变量有一个结构。到目前为止,我的结构有一个监视器、一个队列和一个自旋锁。但我不确定条件变量是否应该有一个队列。我的通知看起来像这样:

 void uthread_cv_notify (uthread_cv_t* cv) {
uthread_t* waiter_thread;
spinlock_lock(&cv->spinlock);
waiter_thread = dequeue (&cv->waiter_queue);
if(waiter_thread)
{
uthread_monitor_exit(cv->mon);
uthread_stop(TS_BLOCKED);
uthread_monitor_enter(cv->mon);
spinlock_unlock(&cv->spinlock);
}
}

但我想知道在通知函数或等待函数中我是否应该只在监视器的等待队列中入队和出队?

谢谢

最佳答案

信号操作(您正在调用通知)不应要求输入监视器。这是低效的。

看起来你正在尝试实现一些笨拙的老式条件/监视器系统,其中“通知”的调用者必须在监视器内,并且保证如果线程正在等待,该线程将获得监视器在“通知”调用者返回监视器之前。 (并且那个等待线程也不必有一个循环重新测试条件。)

这可能是 C. A. R. Hoare 最初描述监视器和条件的方式,但这种形式在现代多处理器系统上是不切实际/低效的,而且在没有与低级调度程序极其紧密集成的线程实现上也是如此(为了能够精确控制哪个线程何时运行,因此不存在关于谁首先获得互斥量的竞争:例如,能够将线程从一个等待队列转移到另一个等待队列,等等)

请注意您是如何在 spinlock_lock 操作和 dequeue 操作上扩展监视器的临界区的。这些都不属于监视器。自旋锁是独立的,队列由自旋锁守护,而不是由监视器守护。监视器应该只保护用户代码的共享变量(等待操作的特殊原子属性)。

关于c - 条件变量有队列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9914589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com