我写了生产者 - 消费者如下:
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)
循环中。这很有效。
这种方法有问题吗?我错过了什么?