Windows环境下创建一个控制台进程,创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥
时间: 2024-05-10 20:16:17 浏览: 137
这是一个典型的生产者消费者问题,可以使用互斥锁和条件变量来实现同步和互斥。
下面是一个简单的示例代码,使用互斥锁和条件变量来实现生产者消费者问题的同步和互斥:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;
mutex mtx;
condition_variable cv;
queue<int> q;
const int n = 10; // 缓冲区大小
int count = 0; // 生产者和消费者的数量
// 生产者线程
void producer(int id) {
while (count < n) {
// 生产数据
int data = rand() % 100;
// 加锁
unique_lock<mutex> lck(mtx);
while (q.size() >= n) {
// 缓冲区已满,等待消费者消费
cv.wait(lck);
}
// 将数据加入缓冲区
q.push(data);
cout << "Producer " << id << " produced " << data << endl;
// 唤醒消费者
cv.notify_all();
// 解锁
lck.unlock();
// 生产者数量加1
count++;
}
}
// 消费者线程
void consumer(int id) {
while (count < n) {
// 加锁
unique_lock<mutex> lck(mtx);
while (q.empty()) {
// 缓冲区为空,等待生产者生产
cv.wait(lck);
}
// 从缓冲区取出数据
int data = q.front();
q.pop();
cout << "Consumer " << id << " consumed " << data << endl;
// 唤醒生产者
cv.notify_all();
// 解锁
lck.unlock();
// 消费者数量加1
count++;
}
}
int main() {
// 创建生产者线程和消费者线程
thread t1(producer, 1);
thread t2(consumer, 1);
thread t3(producer, 2);
thread t4(consumer, 2);
// 等待线程执行完毕
t1.join();
t2.join();
t3.join();
t4.join();
return 0;
}
```
上面的代码创建了两个生产者线程和两个消费者线程,它们共享一个缓冲区。生产者线程会不断地生产数据并将数据加入缓冲区,直到生产者数量达到n。消费者线程会不断地从缓冲区取出数据并消费,直到消费者数量达到n。在生产者和消费者之间使用互斥锁和条件变量来保证同步和互斥,确保生产者和消费者之间的正确性。
阅读全文