Visual Studio 2010多线程编程

随着处理数据量的逐渐增大,串行单核的程序,犹如残灯缺月,无法满足运用需求。大规模集群的出现,解决了这一技术难题。本文旨在探讨如何使用多CPU并行编程,关于CUDA的并行前面文章已有讲述。本文结构分为三部分,第一部分给出一段代码,模拟卖火车票的程序;第二部分对程序进行讲解,方便大家交流学习;第三部分给出程序结果。
一、程序代码
// multi_thread_863.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "windows.h"
#include 
   
   
    
    

using namespace std;

DWORD WINAPI Fun1Proc(
	LPVOID lpParameter
);

DWORD WINAPI Fun2Proc(
	LPVOID lpParameter
);

int index = 0;
int tickets = 100;
HANDLE hMutex;

int main()
{
	HANDLE hThread1;
	HANDLE hThread2;

	//创建互斥对象
	hMutex = CreateMutex(NULL,FALSE,NULL);

	//创建线程
	hThread1 = CreateThread(
		NULL,0,Fun1Proc,NULL,0,NULL);
	hThread2 = CreateThread(
		NULL,0,Fun2Proc,NULL,0,NULL);

	CloseHandle(hThread1);

	CloseHandle(hThread2);

	Sleep(400);

	return 0;
}

//线程1入口函数
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
	while(true)
	{
		WaitForSingleObject(hMutex,INFINITE);
		if(tickets>0)
		{
			Sleep(1);

			cout<<"thread1 sell ticket : "<
    
    
     
     <
     
     
      
      0)
		{
			Sleep(1);

			cout<<"thread2 sell ticket : "<
      
      
       
       <
       
       
      
      
     
     
    
    
   
   

 二、代码讲解

本程序运用两个线程对100张票进行售卖,为了保证同步,使用了互斥对象。

DWORD WINAPI Fun1Proc(
	LPVOID lpParameter
);

DWORD WINAPI Fun2Proc(
	LPVOID lpParameter
);

int index = 0;
int tickets = 100;
HANDLE hMutex;

对两个线程入口函数的申明,定义火车票的总数以及卖出火车票的index,最后创建一个全局变量用于保存互斥对象句柄; 

HANDLE hThread1;
HANDLE hThread2;

//创建互斥对象
hMutex = CreateMutex(NULL,FALSE,NULL);

//创建线程
hThread1 = CreateThread(
	NULL,0,Fun1Proc,NULL,0,NULL);
hThread2 = CreateThread(
	NULL,0,Fun2Proc,NULL,0,NULL);

申请两个HANDLE变量,表示线程的指针;创建互斥对象,三个参数分别为:安全结构指针(NULL表示默认的安全性),互斥对象的初始拥有者(FALSE表示没有),互斥对象的名称(NULL表示默认);最后使用CreateThread创建两个线程,六个参数分别为:安全结构指针(NULL表示默认的安全性),设置初始栈的大小,入口函数指针,给新线程函数的参数,控制线程创建的标记(0表示创建后立即执行),返回值用来接收线程ID;


	CloseHandle(hThread1);

	CloseHandle(hThread2);

	Sleep(400);

	return 0;

关闭新线程的句柄,但没有终止创建的线程;然后休眠400毫秒;

//线程1入口函数
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
	while(true)
	{
		WaitForSingleObject(hMutex,INFINITE);
		if(tickets>0)
		{
			Sleep(1);

			cout<<"thread1 sell ticket : "<
    
    
     
     <
     
     
    
    
线程1入口函数,进入while循环,首先使用WaitForSingleObject(hMutex,INFINITE)请求互斥对象,然后执行小儿科程序,最后释放互斥对象,谁拥有互斥对象谁释放,从而保证了对全局变量的同步访问。线程2同理。
OK,本节内容讲解完毕!
三、运行结果
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值