写,用水果的例子模拟生产者消费者模型,生产者随机生 产水果列表{"Apple","Banana","Cherry","Orange","Pear","Peach","WaterMelon"}中的一 种,缓冲区用数组模拟。程序应用了互斥锁和信号量,使用了CreateMutex, ReleaseMutex,CreateSemaphore,ReleaseSemaphore,WaitForSingleObject等Windows 下的线程函数。
时间: 2023-07-05 08:33:24 浏览: 193
好的,这是一个典型的生产者消费者模型问题。以下是一个用水果的例子模拟生产者消费者模型的示例代码:
```c++
#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
const int BUFFER_SIZE = 5; // 缓冲区大小
string buffer[BUFFER_SIZE]; // 缓冲区数组
int in = 0; // 缓冲区的写指针
int out = 0; // 缓冲区的读指针
HANDLE hMutex; // 互斥锁句柄
HANDLE hEmpty; // 空缓冲区信号量句柄
HANDLE hFull; // 满缓冲区信号量句柄
string fruits[7] = {"Apple","Banana","Cherry","Orange","Pear","Peach","WaterMelon"};
// 生产者线程函数
DWORD WINAPI Producer(LPVOID lpParam) {
while (true) {
// 随机生产一个水果
string fruit = fruits[rand() % 7];
// 等待空缓冲区
WaitForSingleObject(hEmpty, INFINITE);
// 等待互斥锁
WaitForSingleObject(hMutex, INFINITE);
// 将水果放入缓冲区
buffer[in] = fruit;
in = (in + 1) % BUFFER_SIZE;
cout << "Producer produced " << fruit << endl;
// 释放互斥锁
ReleaseMutex(hMutex);
// 发送满缓冲区信号
ReleaseSemaphore(hFull, 1, NULL);
// 等待一定时间再生产下一个水果
Sleep(rand() % 3000 + 1000);
}
return 0;
}
// 消费者线程函数
DWORD WINAPI Consumer(LPVOID lpParam) {
while (true) {
// 等待满缓冲区
WaitForSingleObject(hFull, INFINITE);
// 等待互斥锁
WaitForSingleObject(hMutex, INFINITE);
// 从缓冲区取出一个水果
string fruit = buffer[out];
out = (out + 1) % BUFFER_SIZE;
cout << "Consumer consumed " << fruit << endl;
// 释放互斥锁
ReleaseMutex(hMutex);
// 发送空缓冲区信号
ReleaseSemaphore(hEmpty, 1, NULL);
// 等待一定时间再消费下一个水果
Sleep(rand() % 3000 + 1000);
}
return 0;
}
int main() {
// 初始化随机数种子
srand(time(NULL));
// 创建互斥锁和信号量
hMutex = CreateMutex(NULL, FALSE, NULL);
hEmpty = CreateSemaphore(NULL, BUFFER_SIZE, BUFFER_SIZE, NULL);
hFull = CreateSemaphore(NULL, 0, BUFFER_SIZE, NULL);
// 创建生产者和消费者线程
HANDLE hProducer = CreateThread(NULL, 0, Producer, NULL, 0, NULL);
HANDLE hConsumer = CreateThread(NULL, 0, Consumer, NULL, 0, NULL);
// 等待线程结束
WaitForSingleObject(hProducer, INFINITE);
WaitForSingleObject(hConsumer, INFINITE);
// 关闭句柄
CloseHandle(hMutex);
CloseHandle(hEmpty);
CloseHandle(hFull);
return 0;
}
```
在这个例子中,我们使用了三个句柄分别表示互斥锁、空缓冲区信号量和满缓冲区信号量。生产者线程随机生产一个水果,并将其放入缓冲区中,然后发送满缓冲区信号。消费者线程从缓冲区中取出一个水果,并发送空缓冲区信号。如果缓冲区已满,生产者线程会等待满缓冲区信号;如果缓冲区为空,消费者线程会等待空缓冲区信号。在访问缓冲区时,我们使用互斥锁来保证线程安全。
阅读全文