window 多线程学习

进程与线程

进程:(1)是系统中正在运行的一个应用程序。

2)资源的分配单位。一个32位的windows程序并不执行什么指令,但他占据着4GB的地址空间,地址空间内有代码、数据、资源等等。

3)单个进程可能包含几个线程,一个32windows进程一定有一个主线程。如果没有执行的线程,进程就没有存在的必要,系统将自动清除进程及地址空间,

线程:(1)进程中执行运行的最小单位,是一项任务。

2)程序代码的执行途径外加一组操作系统分配的资源(堆栈,寄存器的状态)。

3)线程启动快,退出快,对系统资源冲击小,能提高应用程序的相应速度。但付出的代价是必须小心设计,且运行不可预测,测试困难。

线程的同步:

程序的并发执行带来与时间有关的错误,甚至引发灾难性的后果,这需要引入同步机制。使用多进程与多线程时,有时需要协同两种或多种动作,此过程就称为同步。引入同步机制的第一个原因是为了控制线程之间的资源同步访问。第二个原因是确保线程之间的动作以指定的次序发生。

Win32 API提供了4种同步控制的对象来帮助程序员解决共享资源的访问冲突。有互斥体对象(Mutex)、信号对象(Semaphore)、事件对象(Event)、排斥区对象(Critical Section)。

四种对象分别适用的场合:

如果某个线程必须等待某些事件发生后才能存取相应的资源,则用CEvent

如果一个应用同时可以有多个线程存取相应的资源,则用Csemaphore

如果有多个应用(多个进程)同时存取相应的资源,则用CMutex,否则则用CcriticalSection

互斥量和临界区的区别:

临界区是最简单的同步方法也是最常用的方法,临界区的出现形式是一小段代码,这一小段代码中包含互斥资源。临界区有一定的局限性:它只能用于同步单个进程中的线程。

互斥量和临界区相似,临界区的使用非常简单,但不能用于进程间的数据同步,互斥量则可以用于进程间数据的同步。

下面的代码实现交替显示“BABABABA……”的程序:

// CEventexample.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<afxmt.h>
#include <process.h>
CEvent g_Event1(FALSE,TRUE);
CEvent g_Event2(TRUE,TRUE);
DWORD WINAPI Thread1(LPVOID pParm)
{

	for (int i=0;i<10;i++)
	{
		g_Event1.Lock();
		//method 1
// 		g_Event2.ResetEvent();
// 		printf("in the Thread1(%d):%s\n",i,"A");
// 		g_Event2.SetEvent();

		//method2
		printf("in the Thread1(%d):%s\n",i,"A");
		g_Event2.PulseEvent();
		g_Event1.ResetEvent();

//		g_Event2.Unlock();
	}

	return 0;
}
DWORD WINAPI Thread2(LPVOID pParm)
{

	for (int i=0;i<10;i++)
	{
		g_Event2.Lock();
		//method 1
// 		g_Event1.ResetEvent();
// 		printf("in the Thread2(%d):%s\n",i,"B");
// 		g_Event1.SetEvent();

		//method 2
		printf("in the Thread2(%d):%s\n",i,"B");
		g_Event1.PulseEvent();
		g_Event2.ResetEvent();

//		g_Event1.Unlock();

	}
	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{

	HANDLE hThread[2];
	hThread[0]=CreateThread(NULL,0,Thread1,NULL,0,NULL);
	hThread[1]=CreateThread(NULL,0,Thread2,NULL,0,NULL);
	WaitForMultipleObjects(2,hThread,TRUE,INFINITE);
	return 0;
}


采用手动CEvent对象的方法,设置两个CEvent对象,一个初始无信号,一个初始有信号。然后建立两个线程 Thread1(用来实现“A”),Thread2(用来显示“B”)。但是要先启动Thread2再启动Thread2。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值