WIN32多线程抢红包练习

第一个文本框是奖池,右面三个文本框是三个线程抢到的红包数,程序运行结果如下:
在这里插入图片描述

在这里插入图片描述

解决资源抢占问题,WIN32提供两种方式:临界区和互斥体。

临界区和互斥体的对比:
1、临界区只能应用于单个进程间的线程控制,互斥体可以跨进程;
2、互斥体可以设定阻塞等待超时,临界区不能;
3、线程意外终结时,互斥体可以避免死锁;
4、互斥体效率比临界区低。

临界区实现

// RedPack.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

/************************************************************************/
/* 
抢红包多线程练习
*/
/************************************************************************/

#include <WINDOWS.H>
#include <STDIO.H>
#include <TCHAR.H>
#include "resource.h"

HWND hEditTotal, hEditA, hEditB, hEditC;
CRITICAL_SECTION csTotal;

DWORD WINAPI ThreadA(LPVOID p)
{
   
	int nTotal;
	int nValue;
	TCHAR szBuffer[100];
	BOOL bFlag = TRUE;
	while (bFlag)
	{
   		
		EnterCriticalSection(&csTotal);
		GetWindowText(hEditTotal, szBuffer, 100);
		_stscanf(szBuffer, TEXT("%d"), &nTotal);
		GetWindowText(hEditA, szBuffer, 100);
		_stscanf(szBuffer, TEXT("%d"), &nValue);		
		if (nTotal >= 50)
		{
   
			nTotal -= 50;
			nValue += 50;
		}
		else
		{
   
			bFlag = FALSE;
		}		
		_stprintf(szBuffer, TEXT("%d"), nTotal);
		SetWindowText(hEditTotal, szBuffer);
		_stprintf(szBuffer, TEXT("%d"), nValue);
		SetWindowText(hEditA, szBuffer);
		LeaveCriticalSection(&csTotal);		
		// 延迟
		Sleep(50);
	}	
	return 0;
}

DWORD WINAPI ThreadB(LPVOID p)
{
   
	int nTotal;
	int nValue;
	TCHAR szBuffer[100];
	BOOL bFlag = TRUE;
	while (bFlag)
	{
   		
		EnterCriticalSection(&csTotal);
		GetWindowText(hEditTotal, szBuffer, 100);
		_stscanf(szBuffer, TEXT("%d"), &nTotal);
		GetWindowText(hEditB, szBuffer, 100);
		_stscanf(szBuffer, TEXT("%d"), &nValue);		
		if (nTotal >= 50)
		{
   
			nTotal -= 50;
			nValue += 50;
		}
		else
		{
   
			bFlag = FALSE;
		}		
		_stprintf(szBuffer, TEXT("%d"), nTotal);
		SetWindowText(hEditTotal, szBuffer);
		_stprintf(szBuffer, TEXT("%d"), nValue);
		SetWindowText(hEditB, szBuffer);</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值