在C++面試中赴肚,如果需要展示生產(chǎn)者-消費(fèi)者模型的代碼,以下是一個(gè)使用標(biāo)準(zhǔn)庫(kù)中的std::mutex
屉更、std::condition_variable
以及std::unique_lock
實(shí)現(xiàn)的示例:
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx; // 互斥鎖
std::condition_variable cv; // 條件變量
std::vector<int> buffer; // 共享緩沖區(qū)
const int MAX_SIZE = 10; // 緩沖區(qū)最大容量
// 生產(chǎn)者函數(shù)
void producer(int id) {
for (int i = 0; i < 10; ++i) {
std::unique_lock<std::mutex> lock(mtx);
buffer.push_back(i * id); // 生產(chǎn)數(shù)據(jù)
std::cout << "Producer " << id << " produced: " << i * id << std::endl;
cv.notify_one(); // 喚醒一個(gè)等待的消費(fèi)者
lock.unlock(); // 顯式解鎖,雖然unique_lock在析構(gòu)時(shí)會(huì)自動(dòng)解鎖
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模擬生產(chǎn)所需時(shí)間
}
}
// 消費(fèi)者函數(shù)
void consumer(int id) {
for (;;) {
std::unique_lock<std::mutex> lock(mtx);
while (buffer.empty()) {
cv.wait(lock); // 如果緩沖區(qū)為空,消費(fèi)者等待
}
int data = buffer.front();
buffer.erase(buffer.begin()); // 消費(fèi)數(shù)據(jù)
std::cout << "Consumer " << id << " consumed: " << data << std::endl;
lock.unlock(); // 顯式解鎖
std::this_thread::sleep_for(std::chrono::milliseconds(150)); // 模擬消費(fèi)所需時(shí)間
}
}
int main() {
std::thread producers[2], consumers[2];
// 啟動(dòng)生產(chǎn)者線(xiàn)程
for (int i = 0; i < 2; ++i) {
producers[i] = std::thread(producer, i + 1);
}
// 啟動(dòng)消費(fèi)者線(xiàn)程
for (int i = 0; i < 2; ++i) {
consumers[i] = std::thread(consumer, i + 1);
}
// 等待生產(chǎn)者線(xiàn)程結(jié)束
for (int i = 0; i < 2; ++i) {
producers[i].join();
}
// 消費(fèi)者線(xiàn)程應(yīng)該在適當(dāng)?shù)臅r(shí)候退出毡熏,這里為了示例簡(jiǎn)單,我們讓它們一直運(yùn)行
// 在實(shí)際應(yīng)用中侣诵,應(yīng)該有一個(gè)機(jī)制來(lái)優(yōu)雅地停止消費(fèi)者線(xiàn)程
return 0;
}
這段代碼中的關(guān)鍵點(diǎn)包括:
- 使用
std::mutex
來(lái)同步對(duì)共享緩沖區(qū)buffer
的訪(fǎng)問(wèn)痢法。 - 使用
std::condition_variable
來(lái)同步生產(chǎn)者和消費(fèi)者的行為。生產(chǎn)者生產(chǎn)數(shù)據(jù)后通知消費(fèi)者杜顺,消費(fèi)者在緩沖區(qū)空時(shí)等待生產(chǎn)者财搁。 -
producer
函數(shù)模擬生產(chǎn)數(shù)據(jù)并放入緩沖區(qū),然后喚醒一個(gè)等待的消費(fèi)者躬络。 -
consumer
函數(shù)模擬消費(fèi)數(shù)據(jù)尖奔,從緩沖區(qū)取出數(shù)據(jù)并處理。如果緩沖區(qū)為空穷当,則等待生產(chǎn)者的通知提茁。 -
main
函數(shù)中創(chuàng)建并啟動(dòng)了生產(chǎn)者和消費(fèi)者線(xiàn)程,并等待生產(chǎn)者線(xiàn)程結(jié)束馁菜。消費(fèi)者線(xiàn)程在這個(gè)示例中會(huì)無(wú)限循環(huán)茴扁,但在實(shí)際應(yīng)用中應(yīng)該有一個(gè)退出條件。
面試回答示例:
"在C++中火邓,我們可以使用std::mutex
和std::condition_variable
來(lái)實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型丹弱。std::mutex
用于保護(hù)共享資源德撬,確保同時(shí)只有一個(gè)線(xiàn)程可以訪(fǎng)問(wèn)緩沖區(qū)。std::condition_variable
用于在生產(chǎn)者生產(chǎn)數(shù)據(jù)后通知消費(fèi)者躲胳,以及在消費(fèi)者等待數(shù)據(jù)時(shí)掛起蜓洪。生產(chǎn)者將數(shù)據(jù)放入緩沖區(qū),并使用notify_one
喚醒一個(gè)等待的消費(fèi)者坯苹。消費(fèi)者在緩沖區(qū)空時(shí)使用wait
掛起隆檀,直到被生產(chǎn)者通知。這個(gè)模型確保了線(xiàn)程安全和有效的線(xiàn)程間通信粹湃。"