【问题标题】:using a mutex as a condition variable使用互斥锁作为条件变量
【发布时间】:2023-03-10 06:36:01
【问题描述】:

给定条件变量的规范示例

pthread_mutex_lock(&count_mutex);
pthread_cond_wait(&count_threshold_cv, &count_mutex);

然后我可以从另一个线程发送一个信号,这个线程将继续。

但是我看不出仅仅尝试锁定互斥锁有什么问题,如果锁被占用,那么线程将等待互斥锁被释放。

这种方法的唯一问题是不断轮询吗?

谢谢

【问题讨论】:

    标签: c++ c multithreading pthreads


    【解决方案1】:

    让我们把它具体化。您建议的条件变量替代方法是让“服务员”这样做:

    loop:
        lock mutex
        check predicate
        if (predicate is false)
            unlock mutex
            sleep a bit // (is this what you had in mind?)
            goto loop
    

    对于“信号器”来说:

        lock mutex
        make predicate true
        unlock mutex
    

    例如,这里的“谓词”可能是“队列不为空”。

    这种方法有两个问题。第一个是您确定的:持续轮询效率低下。如果您想象整个系统中成百上千的线程试图以这种方式运行,那么它会使系统陷入瘫痪。或者你的“睡一会”必须很长,以至于睡眠本身会增加烦人的延迟。

    第二个问题更微妙。不能保证当一个线程解锁一个互斥体然后再次锁定它时,另一个等待该互斥体的线程将被允许运行。 (互斥锁的这个属性称为“公平”;提供它的互斥锁被称为“公平”。POSIX 确实要求互斥锁是公平的。)无论您在“服务员”,无法保证“信号员”永远通过其lock mutex 呼叫。

    条件变量解决了这两个问题。

    【讨论】:

      【解决方案2】:

      条件变量表示对受互斥体保护的数据结构的更改。例如。您可能有一个受互斥体保护的队列,当它变空时,您希望消费者等待条件变量,直到队列不再为空。您想自动释放互斥锁并在这种情况下等待。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2015-11-17
        • 2018-03-09
        • 2011-06-12
        相关资源
        最近更新 更多