c++代码要求父进程创建两个子线程,父进程和两个子线程模拟3个售票窗口进行售卖15张火车票,直到售完为止。假设1个窗口售卖1张火车票的时间为1秒。
时间: 2024-02-17 07:03:09 浏览: 72
好的,以下是一个满足要求的 C++ 代码示例:
```c++
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
const int TICKET_NUM = 15; // 票的数量
int ticketsSold = 0; // 已售出的票数
mutex mtx; // 互斥锁,用于保护 ticketsSold 的修改
void sellTicket(int windowNum) {
while (true) {
mtx.lock(); // 加锁
if (ticketsSold >= TICKET_NUM) {
mtx.unlock(); // 解锁
break;
}
// 模拟售票过程
++ticketsSold;
cout << "窗口" << windowNum << "售出第" << ticketsSold << "张票" << endl;
mtx.unlock(); // 解锁
this_thread::sleep_for(chrono::seconds(1)); // 等待1秒
}
}
int main() {
thread t1(sellTicket, 1); // 创建子线程1
thread t2(sellTicket, 2); // 创建子线程2
sellTicket(0); // 父进程也卖票
t1.join(); // 等待子线程1执行完毕
t2.join(); // 等待子线程2执行完毕
cout << "所有票已售完" << endl;
return 0;
}
```
该程序中,使用了一个 `ticketsSold` 变量来记录已售出的票数,使用一个互斥锁保护该变量的修改。父进程和两个子线程都调用了 `sellTicket` 函数进行售票,直到所有票都售完为止。其中,子线程通过 `thread` 类创建,并且传入一个参数表示窗口号,父进程不需要传入窗口号,因此传入了一个0作为参数。
注意,在访问共享变量 `ticketsSold` 时,需要加锁保护,否则可能会出现竞态条件。同时,在加锁后需要立即进行操作,不要进行耗时的操作,否则会降低程序的效率。
阅读全文