經典的多線程問題之一是生產者-消費者問題。該問題涉及到兩個角色:生產者和消費者,它們共享一個緩沖區。生產者將產品放入緩沖區,消費者從緩沖區取出產品。但是,緩沖區有限,并且在緩沖區已滿或為空時,生產者和消費者必須等待。
下面是一個使用VC++編寫的生產者-消費者問題的簡單示例:
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
std::queue<int> buffer;
const int bufferSize = 10;
std::mutex mtx;
std::condition_variable producerCV, consumerCV;
void producer() {
for (int i = 0; i < 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
producerCV.wait(lock, [] { return buffer.size() < bufferSize; });
buffer.push(i);
std::cout << "Produced: " << i << std::endl;
lock.unlock();
consumerCV.notify_one();
}
}
void consumer() {
for (int i = 0; i < 20; ++i) {
std::unique_lock<std::mutex> lock(mtx);
consumerCV.wait(lock, [] { return !buffer.empty(); });
int value = buffer.front();
buffer.pop();
std::cout << "Consumed: " << value << std::endl;
lock.unlock();
producerCV.notify_one();
}
}
int main() {
std::thread producerThread(producer);
std::thread consumerThread(consumer);
producerThread.join();
consumerThread.join();
return 0;
}
在上述示例中,我們使用一個互斥鎖(std::mutex
)來保護共享資源(緩沖區)。std::condition_variable
用于在緩沖區滿或為空時,生產者和消費者進行等待和通知。
producer
函數模擬生產者的行為:生產產品并將其放入緩沖區。如果緩沖區已滿,生產者線程將等待,直到消費者線程取出一個產品。
consumer
函數模擬消費者的行為:從緩沖區取出產品并消費。如果緩沖區為空,消費者線程將等待,直到生產者線程放入一個產品。
在main
函數中,我們創建了兩個線程分別執行生產者和消費者函數,并等待它們完成。
以上示例是一個簡單的多線程問題的解決方案,但在實際應用中可能需要考慮更多的情況,如線程同步、死鎖避免等。