經(jīng)典的多線程問(wèn)題之一是生產(chǎn)者-消費(fèi)者問(wèn)題。該問(wèn)題涉及到兩個(gè)角色:生產(chǎn)者和消費(fèi)者,它們共享一個(gè)緩沖區(qū)。生產(chǎn)者將產(chǎn)品放入緩沖區(qū),消費(fèi)者從緩沖區(qū)取出產(chǎn)品。但是,緩沖區(qū)有限,并且在緩沖區(qū)已滿或?yàn)榭諘r(shí),生產(chǎn)者和消費(fèi)者必須等待。
下面是一個(gè)使用VC++編寫的生產(chǎn)者-消費(fèi)者問(wèn)題的簡(jiǎn)單示例:
#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;
}
在上述示例中,我們使用一個(gè)互斥鎖(std::mutex
)來(lái)保護(hù)共享資源(緩沖區(qū))。std::condition_variable
用于在緩沖區(qū)滿或?yàn)榭諘r(shí),生產(chǎn)者和消費(fèi)者進(jìn)行等待和通知。
producer
函數(shù)模擬生產(chǎn)者的行為:生產(chǎn)產(chǎn)品并將其放入緩沖區(qū)。如果緩沖區(qū)已滿,生產(chǎn)者線程將等待,直到消費(fèi)者線程取出一個(gè)產(chǎn)品。
consumer
函數(shù)模擬消費(fèi)者的行為:從緩沖區(qū)取出產(chǎn)品并消費(fèi)。如果緩沖區(qū)為空,消費(fèi)者線程將等待,直到生產(chǎn)者線程放入一個(gè)產(chǎn)品。
在main
函數(shù)中,我們創(chuàng)建了兩個(gè)線程分別執(zhí)行生產(chǎn)者和消費(fèi)者函數(shù),并等待它們完成。
以上示例是一個(gè)簡(jiǎn)單的多線程問(wèn)題的解決方案,但在實(shí)際應(yīng)用中可能需要考慮更多的情況,如線程同步、死鎖避免等。