用Visual Studio实现生产者消费者问题
时间: 2024-01-10 19:04:16 浏览: 73
生产者消费者问题是一个经典的同步问题,可以用多种方式实现。下面是用C++和Visual Studio编写的一个简单的生产者消费者问题解决方案:
```c++
#include <iostream>
#include <Windows.h>
#include <queue>
using namespace std;
#define BUFFER_SIZE 10
HANDLE hMutex;
HANDLE hEmpty;
HANDLE hFull;
queue<int> buffer;
DWORD WINAPI Producer(LPVOID lpParam) {
for (int i = 0; i < 20; i++) {
WaitForSingleObject(hEmpty, INFINITE);
WaitForSingleObject(hMutex, INFINITE);
buffer.push(i);
cout << "Producer produces " << i << " (buffer size: " << buffer.size() << ")" << endl;
ReleaseMutex(hMutex);
ReleaseSemaphore(hFull, 1, NULL);
Sleep(500);
}
return 0;
}
DWORD WINAPI Consumer(LPVOID lpParam) {
for (int i = 0; i < 20; i++) {
WaitForSingleObject(hFull, INFINITE);
WaitForSingleObject(hMutex, INFINITE);
int data = buffer.front();
buffer.pop();
cout << "Consumer consumes " << data << " (buffer size: " << buffer.size() << ")" << endl;
ReleaseMutex(hMutex);
ReleaseSemaphore(hEmpty, 1, NULL);
Sleep(1000);
}
return 0;
}
int main() {
HANDLE hThreadProducer, hThreadConsumer;
hMutex = CreateMutex(NULL, FALSE, NULL);
hEmpty = CreateSemaphore(NULL, BUFFER_SIZE, BUFFER_SIZE, NULL);
hFull = CreateSemaphore(NULL, 0, BUFFER_SIZE, NULL);
hThreadProducer = CreateThread(NULL, 0, Producer, NULL, 0, NULL);
hThreadConsumer = CreateThread(NULL, 0, Consumer, NULL, 0, NULL);
WaitForSingleObject(hThreadProducer, INFINITE);
WaitForSingleObject(hThreadConsumer, INFINITE);
CloseHandle(hMutex);
CloseHandle(hEmpty);
CloseHandle(hFull);
return 0;
}
```
在这个程序中,我们使用了三个同步对象:
- 互斥体(Mutex):用于保护缓冲区的访问,只允许一个线程进入缓冲区;
- 信号量(Semaphore):用于控制缓冲区的空闲和占用状态,分别对应缓冲区为空和满的情况;
- 线程(Thread):分别表示生产者和消费者线程。
在生产者线程中,我们先等待缓冲区为空的信号量,然后获取互斥体的锁,向缓冲区中加入数据,输出一条生产者生产数据的消息,然后释放互斥体的锁,增加缓冲区占用的信号量,最后休眠一段时间。
在消费者线程中,我们先等待缓冲区为满的信号量,然后获取互斥体的锁,从缓冲区中取出数据,输出一条消费者消费数据的消息,然后释放互斥体的锁,增加缓冲区空闲的信号量,最后休眠一段时间。
程序中的参数可以根据需要进行调整,例如缓冲区大小、生产者和消费者线程的数量等。
阅读全文