【问题标题】:Building a multithreaded work-queue (consumer/producer) in C++在 C++ 中构建多线程工作队列(消费者/生产者)
【发布时间】:2023-03-16 15:47:01
【问题描述】:

我有以下情况:我有一个应该填充一个线程 带有整数对的容器(本质上是任务描述),我有一个大的 应从此容器中获取元素并执行的工作线程数 (8-16) 一些工作。

我认为这个问题可以通过阻塞队列轻松解决——例如在删除项目时,线程同步对队列的访问,如果没有可用数据则休眠。

我(也许是错误的)假设这样的东西应该存在于 STL 或 boost 中,但我找不到任何东西。

我真的必须自己实现那个东西吗?这似乎是一种常见的情况......

【问题讨论】:

    标签: c++ multithreading deque


    【解决方案1】:

    如果您自己实现它,那么该实现应该是信号量、互斥体和队列对象的相当简单的组合。

    这是一些伪代码:

    Produce{
        pthread_mutex_lock(&mutex);
        queue.push_back(someObjectReference);
        pthread_mutex_unlock(&mutex);
        sem_post(&availabilitySem);
    }
    
    Consume{
        sem_wait(&availabilitySem);
        pthread_mutex_lock(&mutex);
        queue.pop_front(someObjectReference);
        pthread_mutext_unlock(&mutex);
    }
    

    【讨论】:

    • 值得注意的是,根据您的信号量实现,Consume 进程可能需要在循环内运行
    【解决方案2】:

    如果您使用的是 Windows,请查看 VS2010 中的代理库,这是一个核心场景。

    http://msdn.microsoft.com/en-us/library/dd492627(VS.100).aspx

    //an unbounded_buffer is like a queue
    unbounded_buffer<int> buf;
    
    //you can send messages into it with send or asend
    send(buf,1);
    
    //receive will block and wait for data
    int result = receive(buf)
    

    您可以使用线程、“代理”或“任务”来获取数据......或者您可以将缓冲区链接在一起并将您的阻塞语义生产者/消费者问题转换为数据流网络。

    【讨论】:

      【解决方案3】:

      如果您在 Windows 上并且想要一个在管理允许运行的线程以从中处理项目方面高效的队列,请查看 IO 完成端口(请参阅here)。我的free server framework 包括一个基于 IOCP 的任务队列实现,如果您打算沿着这条路线走,也可能会感兴趣;虽然它可能对你想要的来说太专业了。

      【讨论】:

        【解决方案4】:

        我认为boost::interprocess 中的message_queue 是您想要的。第二个链接有一个使用示例。

        【讨论】:

          【解决方案5】:

          您应该看看ACE (Adaptive Communication Environment) 和ACE_Message_Queue。总是有 boost 的 message_queue,但 ACE 在高性能并发方面处于领先地位。

          【讨论】:

            【解决方案6】:

            如果您使用的是 OSX Snow Leopard,您可能需要查看 Grand Central Dispatch

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-24
              • 1970-01-01
              • 2017-02-01
              • 1970-01-01
              • 2011-01-09
              相关资源
              最近更新 更多