火车票两个窗口售票,两个窗口(开启两个线程)同时在售票,总票数n张,两个窗口单独售票,使用的API如下:
_beginthread//创建线程
WaitForMultipleObject//阻塞等待线程执行
Sleep//线程休眠
程序例程:
// 两个窗口售卖火车票.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <process.h>
#include <Windows.h>
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
static int tickets = 100;
void sellFun1(void* param)
{
char* name=(char*)param;
while (tickets>0)
{
//cout << name << "卖出票" << tickets-- << endl;
//位置A
Sleep(10);
printf("%s卖出票%d\n", name, tickets--);
}
}
void sellFun2(void* param)
{
char* name = (char*)param;
while (tickets>0)
{
//cout << name << "卖出票" << tickets-- << endl;
//位置B
Sleep(10);
printf("%s卖出票%d\n", name, tickets--);
}
}
int main()
{
cout << "开始售票" << endl;
HANDLE sell1 = (HANDLE)_beginthread(sellFun1, 0, "售票窗口A");
HANDLE sell2 = (HANDLE)_beginthread(sellFun2, 0, "售票窗口B");
HANDLE hThreadArr[] = { sell1,sell2 };
WaitForMultipleObjects(2, hThreadArr, true, INFINITE);
cout << "售票结束" << endl;
return 0;
}
说明:
- 两个线程阻塞等待执行,当两个线程都运行完之后主线程才退出
- 设置全局变量票数,两个线程每执行一次都会使票数减1,知道票数为0之后会退出当前线程
- 会出现0票的问题,当线程A运行至位置A时,这时的剩余票数为1张,此时线程B运行,恰巧运行到位置B,由于A线程还未执行减1操作,所以此时线程B的票数也为1,线程B接着向下执行,将最后一张票卖出,票数减为0,线程B退出while循环,然后线程B运行结束,由于线程A执行到了位置A处,还未结束,所以线程A会接着向下执行,卖出第0张票,然后票数不满足while条件,while退出,线程A运行结束,至此,两个线程运行全部结束,主线程停止等待,接着向下执行,知道程序结束
- 线程A、B执行函数while循环条件必须要设置为>0,不能只写成while(tickets),单线程运行时,这样写没有问题,当票数为0时会退出while循环,但是在多线程中,票数为1时运行到位置A,然后运行线程B,B将票数减1,此时线程变成0,然后接着执行线程A,线程A将票数减1,此时tickets为-1,对于while来说-1也为真,此后循环条件一直满足,会一直循环下去,当然将int型循环一圈后终会变为0,退出while,从而退出线程,但显然这不符合我们预期