windows并发编程API(五)-应用

火车票两个窗口售票,两个窗口(开启两个线程)同时在售票,总票数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. 两个线程阻塞等待执行,当两个线程都运行完之后主线程才退出
  2. 设置全局变量票数,两个线程每执行一次都会使票数减1,知道票数为0之后会退出当前线程
  3. 会出现0票的问题,当线程A运行至位置A时,这时的剩余票数为1张,此时线程B运行,恰巧运行到位置B,由于A线程还未执行减1操作,所以此时线程B的票数也为1,线程B接着向下执行,将最后一张票卖出,票数减为0,线程B退出while循环,然后线程B运行结束,由于线程A执行到了位置A处,还未结束,所以线程A会接着向下执行,卖出第0张票,然后票数不满足while条件,while退出,线程A运行结束,至此,两个线程运行全部结束,主线程停止等待,接着向下执行,知道程序结束
  4. 线程A、B执行函数while循环条件必须要设置为>0,不能只写成while(tickets),单线程运行时,这样写没有问题,当票数为0时会退出while循环,但是在多线程中,票数为1时运行到位置A,然后运行线程B,B将票数减1,此时线程变成0,然后接着执行线程A,线程A将票数减1,此时tickets为-1,对于while来说-1也为真,此后循环条件一直满足,会一直循环下去,当然将int型循环一圈后终会变为0,退出while,从而退出线程,但显然这不符合我们预期
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值