C ++单生产者多个消费者程序偶尔崩溃

沉没

在下面的代码中,我正在创建一个producer threadn consumer threadsqueue从其专用内容和打印内容读取stdout该代码有时会在语句时崩溃consumerQueues[id]->empty()通过调试去我看到consumerQueues[id]0x0当它崩溃。现在在init()函数中,我在创建工作程序之前创建了ith使用者我不确定为什么会保留下去请帮我弄清楚发生了什么。queueiththreadconsumerQueues[id]0x0

#include <thread>
#include <queue>
#include <memory>
#include <iostream>
#include <mutex>
#include <condition_variable>

class Test
{
private:
    void producer()
    {
        while(true)
        {
            std::string s = "abc";
            for(const auto& q : consumerQueues)
            {
                std::unique_lock<std::mutex> lock(mutex);
                q->push(s);
                condition_variable.notify_all();
            }
        }
    }

    void consumer(int id)
    {
        while (true)
        {
            std::string job;
            {
                std::unique_lock<std::mutex> lock(mutex);
                while(consumerQueues[id]->empty())
                {
                    condition_variable.wait(lock);
                }
                job = consumerQueues[id]->front();
                consumerQueues[id]->pop();
            }
            std::cout << "ID "<< id << " job " << job << std::endl;
        }
    }

    std::mutex mutex;
    std::condition_variable condition_variable;
    std::vector<std::thread> workers;
    std::vector<std::shared_ptr<std::queue<std::string>>> consumerQueues;
    std::thread producerThread;

public:

    Test(const unsigned n_threads):
    workers(std::vector<std::thread>(n_threads))
    {}

    Test(const Test &) = delete;
    Test(Test &&) = delete;

    Test & operator=(const Test &) = delete;
    Test & operator=(Test &&) = delete;

    void init()
    {
        for (unsigned i = 0; i < workers.size(); ++i)
        {
            consumerQueues.push_back(std::make_shared<std::queue<std::string>>());
            workers[i] = std::thread(&Test::consumer, this, i);
        }
       producerThread  = std::thread(&Test::producer, this);
    }

    ~Test()
    {
        producerThread.join();
        for (unsigned i = 0; i < workers.size(); ++i)
        {
            if(workers[i].joinable())
            {
                workers[i].join();
            }
        }
    }
};


int main()
{
    Test t(1000);
    t.init();
    return 0;
}
霍尔姆

您的init函数正在修改没有互斥量的std :: vector。这将在线程逐个启动的同时修改向量。

为了使这项工作有效,您的init函数必须是这样的:

 void init() {
     for (unsigned i = 0; i < workers.size(); ++i) {
            std::unique_lock<std::mutex> lock(mutex);
            consumerQueues.push_back(std::make_shared<std::queue<std::string>>());
            workers[i] = std::thread(&Test::consumer, this, i);
     }
     producerThread  = std::thread(&Test::producer, this);
 }

来自:http : //www.cplusplus.com/reference/vector/vector/push_back/

数据竞赛

容器已修改。如果发生重新分配,则会修改所有包含的元素。否则,将不访问任何现有元素,并且安全地并发访问或修改它们。

重新分配通常从0个元素开始到1000个时发生。因此,您还可以保留向量的大小,以确保没有发生重新分配:

 void init() {
     consumerQueues.reserve(workers.size());
     for (unsigned i = 0; i < workers.size(); ++i) {
            consumerQueues.push_back(std::make_shared<std::queue<std::string>>());
            workers[i] = std::thread(&Test::consumer, this, i);
     }
     producerThread  = std::thread(&Test::producer, this);
 }

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C:生产者/消费者

C中的生产者-消费者错误

C中的快速生产者/缓慢消费者

C ++中的多线程生产者/消费者

C ++简单消费者生产者问题

C#等待生产者/消费者中的多个事件

C ++ 11(或更高版本)中的通用多个生产者/消费者感到奇怪

每次在C中工作最后一个消费者(生产者消费者问题)

C# 生产者/消费者设置,如果有 UI,消费者永远不会工作?

具有C#结构的生产者/消费者?

C++11 简单的生产者消费者多线程

为什么condition_variable正在等待生产者-消费者中的锁定?C ++

带有Kafka的C ++-消费者刚刚收到一些生产者消息

'std::system_error',生产者消费者 C++ 并发

简单的生产者-消费者示例C#词典

C ++生产者/消费者模式中的数据竞争是大问题吗?

生产者-消费者在 C 中使用信号量

使用4.0框架类和Blocking Collection的C#中的生产者/混合消费者

如何知道何时停止并行foreach,其中消费者也是C#中的生产者

单生产者多消费者Java

与多个生产者/多个消费者并发

C ++ 11无锁单一生产者单一消费者:如何避免繁忙等待

C# - 如何在生产者/消费者场景中对私有方法进行单元测试?

Java中的多个消费者生产者

通道多个生产者和消费者

使用 asyncio 理解生产者-消费者程序

具有一个生产者和多个消费者的生产者-消费者

生产者,消费者POSIX

“读者-作家”只是具有多个消费者的“生产者-消费者”吗?