具有条件变量的C ++ Producer-Consumer

卡宾枪

寻找使两个线程与条件变量同步的方法,并创建了一个简单的示例进行练习。

想想我在进行同步时搞砸了,因为消费者一直在等待来自简历的信号。

即使存在cv.notify_one()return counter != 0lambda内的行也不会被触发,我完全无法理解为什么。

#include <iostream>
#include <mutex>
#include <thread>
#include <chrono>
using namespace std::chrono_literals;

int main(int, char**)
{
    std::mutex mx;
    std::condition_variable cv;
    int counter;

    std::thread producer( [ & ] ( )
    {
        while( true )
        {
            std::lock_guard<std::mutex> lock( mx );

            std::cout << "adding task" << std::endl;
            std::this_thread::sleep_for(1s);
            ++counter;

            cv.notify_one();
        }
    });

    std::thread consumer( [ & ] ( )
    {
        while( true )
        {
            std::unique_lock<std::mutex> lock( mx );

            cv.wait( lock, [ & ] ( )
            {
                return counter > 0;
            });

            std::cout << "Executing" << std::endl;
            std::this_thread::sleep_for(.5s);
            --counter;
        }
    });

    consumer.join();
    producer.join();

    return 0;
}
埃尔布鲁诺夫斯基

问题显然是公平的,如添加一条线所示

std::this_thread::sleep_for(0.01s);

在生产者获得互斥量之前。

大多数操作系统不会为互斥量提供任何公平保证。

有很多方法可以解决公平问题。如果您知道如何处理,则可以在此处停止。

在您的情况下,假设您的生产者和消费者实际上并没有花费半秒钟或更多的时间将工作放入队列中,并且生产者实际上没有无限量的工作,那么您就不需要根本不用担心。如果操作系统在竞争激烈的时刻偏向生产者而不是消费者,则队列会被填满(或者最终所有待处理的作业最终会进入队列),迫使生产者等待,释放互斥量并允许消费者轮流使用。

请注意,在具有最大队列大小的生产者/消费者方案中,您实际上需要两个条件变量-条件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Looper用于Producer-Consumer模式有什么好处?

来自分类Dev

具有并发调度程序的异步Producer-Consumer应用程序

来自分类Dev

OpenMP Producer-Consumer意外结果

来自分类Dev

python中的Producer-Consumer算法

来自分类Dev

如何使用Semphores在Producer-Consumer中消费?

来自分类Dev

使用信号量和pthread的Producer Consumer程序

来自分类Dev

使用Java中的wait()和notify()的Producer Consumer Program

来自分类Dev

使用Java中的wait()和notify()的Producer Consumer Program

来自分类Dev

Producer-Consumer程序中的线程优先级-wait()和notify()

来自分类Dev

C ++中的Kafka Consumer

来自分类Dev

面板数据:创建具有条件的新变量

来自分类Dev

如果 Producer 宕机,Kafka Consumer 会如何表现。当生产者宕机时,区间内的数据会发生什么变化

来自分类Dev

具有附加参数的Java 8 Consumer

来自分类Dev

具有条件的不同值

来自分类Dev

具有条件功能的DCOUNT

来自分类Dev

有条件的constexpr变量

来自分类Dev

Kafka Producer(具有多个实例)写入同一主题

来自分类Dev

具有条件数组和多个X变量的Excel LINEST

来自分类Dev

C ++ 11有条件的模板

来自分类Dev

有条件的

来自分类Dev

有条件的

来自分类Dev

MVC C#-具有条件的DataRows中的DataTable

来自分类Dev

C#有条件地分配变量值类型

来自分类Dev

具有条件的count> 2的SQL计数发生

来自分类Dev

具有条件的Array.join()

来自分类Dev

具有条件和子功能的excel sumproduct

来自分类Dev

导入具有条件导出的本地模块

来自分类Dev

列出具有条件的联接表

来自分类Dev

多个具有条件的列上的COUNT()