C++11多线程生产者/消费者程序挂起可能是由于多种原因造成的,包括线程同步问题、资源竞争、死锁或者条件变量的不当使用等。下面我将详细解释这些基础概念,并提供一些解决方案。
生产者/消费者模式:这是一种常见的并发设计模式,其中生产者线程负责生成数据,而消费者线程负责处理这些数据。两者通常通过一个共享的缓冲区进行通信。
线程同步:确保多个线程按照一定的顺序访问共享资源,以避免数据不一致或冲突。
条件变量:用于多线程之间的通信,允许线程等待某个条件的成立。
互斥锁(Mutex):用于保护共享资源,防止多个线程同时访问。
以下是一个简单的C++11生产者/消费者示例,并附带一些避免挂起的建议:
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> buffer;
const int bufferSize = 10;
std::mutex mtx;
std::condition_variable cv;
void producer(int id) {
for (int i = 0; i < 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return buffer.size() < bufferSize; });
buffer.push(i);
std::cout << "Producer " << id << " produced "<< i << std::endl;
lock.unlock();
cv.notify_all();
}
}
void consumer(int id) {
for (int i = 0; i < 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !buffer.empty(); });
int val = buffer.front();
buffer.pop();
std::cout << "Consumer " << id << " consumed " << val << std::endl;
lock.unlock();
cv.notify_all();
}
}
int main() {
std::thread p1(producer, 1);
std::thread p2(producer, 2);
std::thread c1(consumer, 1);
std::thread c2(consumer, 2);
p1.join();
p2.join();
c1.join();
c2.join();
return 0;
}
wait
时必须配合一个谓词,以避免虚假唤醒。notify_all
或notify_one
通知等待的线程。通过以上措施,可以有效减少或避免生产者/消费者程序挂起的问题。
领取专属 10元无门槛券
手把手带您无忧上云