请帮我写一个生产者-消费者同步与互斥的C++代码
时间: 2023-08-28 20:22:22 浏览: 101
好的,下面是一个基于互斥量和条件变量的生产者-消费者同步代码:
```c++
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
const int BUFFER_SIZE = 10; // 缓冲区大小
std::queue<int> buffer; // 缓冲区
std::mutex buffer_mutex; // 互斥量,保证同时只有一个线程访问缓冲区
std::condition_variable buffer_not_full; // 缓冲区非满条件变量
std::condition_variable buffer_not_empty; // 缓冲区非空条件变量
void producer()
{
for (int i = 0; i < 20; ++i)
{
std::unique_lock<std::mutex> lock(buffer_mutex);
buffer_not_full.wait(lock, []{ return buffer.size() < BUFFER_SIZE; }); // 等待缓冲区非满
buffer.push(i); // 生产一个数据
std::cout << "生产者生产了数据 " << i << std::endl;
buffer_not_empty.notify_one(); // 通知消费者缓冲区非空
}
}
void consumer()
{
for (int i = 0; i < 20; ++i)
{
std::unique_lock<std::mutex> lock(buffer_mutex);
buffer_not_empty.wait(lock, []{ return !buffer.empty(); }); // 等待缓冲区非空
int data = buffer.front(); // 消费一个数据
buffer.pop();
std::cout << "消费者消费了数据 " << data << std::endl;
buffer_not_full.notify_one(); // 通知生产者缓冲区非满
}
}
int main()
{
std::thread producer_thread(producer);
std::thread consumer_thread(consumer);
producer_thread.join();
consumer_thread.join();
return 0;
}
```
在该代码中,生产者和消费者都使用了一个互斥量 `buffer_mutex` 来保证同时只有一个线程访问缓冲区。当缓冲区满时,生产者会调用 `buffer_not_full.wait(lock, []{ return buffer.size() < BUFFER_SIZE; });` 来等待缓冲区非满,此时生产者会释放 `buffer_mutex`,并等待被通知。当消费者消费了一个数据后,会调用 `buffer_not_full.notify_one();` 来通知生产者缓冲区非满。消费者同理。通过这种方式,生产者和消费者之间就实现了同步。
阅读全文
相关推荐


















