C++中条件变量的常见用途是什么?

jas*_*ine 15 c++ multithreading condition-variable

我正在尝试了解条件变量.我想知道使用条件变量的常见情况.

一个示例是在阻塞队列中,其中两个线程访问队列 - 生产者线程将项目推入队列,而使用者线程从队列中弹出一个项目.如果队列为空,则消费者线程正在等待,直到生产者线程发送信号.

您需要使用条件变量的其他设计情况是什么?

我更喜欢基于经验的例子,例如真实应用程序中的例子.

Ste*_*sop 2

条件变量的一种用途是“共享锁”,它比消息队列稍微复杂一些,其中不同的线程正在等待具有相同基本性质的细微不同的条件。例如,您有一个(非常简陋、简化的)网络缓存。缓存中的每个条目都有三种可能的状态:不存在、IN_PROGRESS、COMPLETE。

getURL:
    lock the cache
    three cases for the key:
        not present:
            add it (IN_PROGRESS)
            release the lock
            fetch the URL
            take the lock
            update to COMPLETE and store the data
            broadcast the condition variable
            goto COMPLETE
        COMPLETE:
            release the lock and return the data
        IN_PROGRESS:
            while (still IN_PROGRESS):
                wait on the condition variable
            goto COMPLETE
Run Code Online (Sandbox Code Playgroud)

我在实践中使用该模式来实现 POSIX 函数的变体,而pthread_once无需调度程序的任何帮助。我无法使用信号量或锁 per once_control,而只能在锁下进行初始化的原因是该函数不允许失败,并且once_control只进行了简单的初始化。就此而言,pthread_once它本身没有定义的错误代码,因此实现它可能会失败并不会给您的调用者留下任何好的选择......

当然,对于这种模式,您必须小心缩放。每次完成初始化时,每个等待线程都会醒来以获取锁。因此,当您设计系统时,您会非常仔细地考虑分片,然后决定在看到经过验证的性能问题之前,您不会费心做任何实际实现它的事情。