另一个生产者 - 消费者,C ++

时间:2018-05-28 01:37:37

标签: c++ multithreading c++11 concurrency producer-consumer

我写了生产者 - 消费者如下:

void producer(int n)
{
    std::unique_lock<std::mutex> lock(mtx);
    for (int i = 0; i < n; ++i) 
    {
        cv.wait(lock, [] {return !notified; });
        std::cout << "Producing.." << i << std::endl;
        Q.push(i);
        notified = true;
        cv.notify_one();
    }
    done = true;
}

void consumer()
{
    std::unique_lock<std::mutex> lock(mtx);
    while (!done) 
    {
        cv.wait(lock, [] {return notified; });
        while (!Q.empty()) 
        {
            std::cout << "Consuming.." << Q.front() << std::endl;
            Q.pop();
            cv.notify_all();
            notified = false;
        }
    }
}

int main()
{
    auto fut1 = std::async(producer, 20);
    auto fut2 = std::async(consumer);
    fut1.get();
    fut2.get();
    system("pause");
}

我认为这是一个罕见的版本(自制的^ _ ^),与众所周知的来源如cppreference的不同之处在于,在生产者中我不强迫线程睡眠,而是等待来自消费者的通知在消费者中我不会将cv.wait包装到while(!notified)循环中。这很有效。
这种方法有问题吗?我错过了什么?

0 个答案:

没有答案