C++生产者消费者模型代码【面试】

在C++面试中,如果需要展示生产者-消费者模型的代码,以下是一个使用标准库中的std::mutexstd::condition_variable以及std::unique_lock实现的示例:

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
std::vector<int> buffer; // 共享缓冲区
const int MAX_SIZE = 10; // 缓冲区最大容量

// 生产者函数
void producer(int id) {
    for (int i = 0; i < 10; ++i) {
        std::unique_lock<std::mutex> lock(mtx);
        buffer.push_back(i * id); // 生产数据
        std::cout << "Producer " << id << " produced: " << i * id << std::endl;
        cv.notify_one(); // 唤醒一个等待的消费者
        lock.unlock(); // 显式解锁,虽然unique_lock在析构时会自动解锁
        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产所需时间
    }
}

// 消费者函数
void consumer(int id) {
    for (;;) {
        std::unique_lock<std::mutex> lock(mtx);
        while (buffer.empty()) {
            cv.wait(lock); // 如果缓冲区为空,消费者等待
        }
        int data = buffer.front();
        buffer.erase(buffer.begin()); // 消费数据
        std::cout << "Consumer " << id << " consumed: " << data << std::endl;
        lock.unlock(); // 显式解锁
        std::this_thread::sleep_for(std::chrono::milliseconds(150)); // 模拟消费所需时间
    }
}

int main() {
    std::thread producers[2], consumers[2];

    // 启动生产者线程
    for (int i = 0; i < 2; ++i) {
        producers[i] = std::thread(producer, i + 1);
    }

    // 启动消费者线程
    for (int i = 0; i < 2; ++i) {
        consumers[i] = std::thread(consumer, i + 1);
    }

    // 等待生产者线程结束
    for (int i = 0; i < 2; ++i) {
        producers[i].join();
    }

    // 消费者线程应该在适当的时候退出,这里为了示例简单,我们让它们一直运行
    // 在实际应用中,应该有一个机制来优雅地停止消费者线程

    return 0;
}

这段代码中的关键点包括:

  1. 使用std::mutex来同步对共享缓冲区buffer的访问。
  2. 使用std::condition_variable来同步生产者和消费者的行为。生产者生产数据后通知消费者,消费者在缓冲区空时等待生产者。
  3. producer函数模拟生产数据并放入缓冲区,然后唤醒一个等待的消费者。
  4. consumer函数模拟消费数据,从缓冲区取出数据并处理。如果缓冲区为空,则等待生产者的通知。
  5. main函数中创建并启动了生产者和消费者线程,并等待生产者线程结束。消费者线程在这个示例中会无限循环,但在实际应用中应该有一个退出条件。

面试回答示例:
"在C++中,我们可以使用std::mutexstd::condition_variable来实现生产者-消费者模型。std::mutex用于保护共享资源,确保同时只有一个线程可以访问缓冲区。std::condition_variable用于在生产者生产数据后通知消费者,以及在消费者等待数据时挂起。生产者将数据放入缓冲区,并使用notify_one唤醒一个等待的消费者。消费者在缓冲区空时使用wait挂起,直到被生产者通知。这个模型确保了线程安全和有效的线程间通信。"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值