使用多线程编程,如何实现多个窗口的售票,考虑如何分配窗口和处理窗口间的竞争。请给出用C++和windows api实现的代码
时间: 2024-03-08 13:46:29 浏览: 22
以下是一个使用C++和Windows API实现多个窗口的售票程序,使用信号量来控制线程的竞争:
```C++
#include <iostream>
#include <thread>
#include <Windows.h>
using namespace std;
// 窗口数量
const int WINDOW_NUM = 5;
// 票数
const int TICKET_NUM = 100;
// 信号量和互斥体句柄
HANDLE sem[WINDOW_NUM];
HANDLE mtx[WINDOW_NUM];
// 售票函数
void sellTicket(int windowId) {
while (true) {
// 等待售票请求
WaitForSingleObject(sem[windowId], INFINITE);
// 获取互斥体
WaitForSingleObject(mtx[windowId], INFINITE);
// 检查是否还有票
static int ticketLeft = TICKET_NUM;
if (ticketLeft <= 0) {
ReleaseMutex(mtx[windowId]);
break;
}
// 售票
cout << "窗口" << windowId << "售出一张票,还剩" << --ticketLeft << "张票" << endl;
// 释放互斥体
ReleaseMutex(mtx[windowId]);
}
}
// 主函数
int main() {
// 创建信号量和互斥体
for (int i = 0; i < WINDOW_NUM; ++i) {
sem[i] = CreateSemaphore(NULL, 0, 1, NULL);
mtx[i] = CreateMutex(NULL, FALSE, NULL);
}
// 创建窗口线程
thread t[WINDOW_NUM];
for (int i = 0; i < WINDOW_NUM; ++i) {
t[i] = thread(sellTicket, i);
}
// 发送售票请求
while (true) {
int windowId;
cout << "请输入窗口号(0-" << WINDOW_NUM-1 << "),或-1退出:";
cin >> windowId;
if (windowId < 0 || windowId >= WINDOW_NUM) {
break;
}
ReleaseSemaphore(sem[windowId], 1, NULL);
}
// 等待线程结束
for (int i = 0; i < WINDOW_NUM; ++i) {
t[i].join();
}
// 关闭信号量和互斥体句柄
for (int i = 0; i < WINDOW_NUM; ++i) {
CloseHandle(sem[i]);
CloseHandle(mtx[i]);
}
return 0;
}
```
在上面的代码中,使用CreateSemaphore和CreateMutex函数创建信号量和互斥体句柄,每个售票线程在售票前会先等待窗口对应的信号量,如果信号量值为0,则线程等待直到有信号量可用。售票线程获取到信号量后,会获取窗口对应的互斥体,检查是否还有票,如果没有则退出,否则售出一张票并释放互斥体。主程序通过输入窗口号来发送售票请求,每次输入窗口号后,就会释放对应的窗口信号量。最后,主程序等待所有窗口线程结束后关闭信号量和互斥体句柄并退出。