Windows多线程基本概念

Windows多线程基本概念1
 

Windows多线程基本概念

 

钱锦锋

 

摘要:

 

关键字:

 

 

1. 引言

 

 

2.线程创建

 

2.1 CreateThread

 

原型:

 

HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes,

 

SIZE_T dwStackSize,

 

LPTHREAD_STATE_ROUTINE lpStartAddress,

 

LPVOID lpParameter,

 

DWORD dwCreationFlags,

 

LPDWORD lpThreadId)

 

 

参数:

 

LPSECURITY_ATTRIBUTES lpThreadAttributes:

 

指向SECURITY_ATTRIBUTES结构的指针,为NULL时线程指向默认安全描述符。

 

SIZE_T dwStackSize:

 

以字节计算的线程栈大小,为0时默认1M

 

LPTHREAD_STATE_ROUTINE lpStartAddress:

 

指向线程处理函数的指针。

 

LPVOID lpParameter:

 

指向传于线程处理函数的参数指针。

 

DWORD dwCreationFlags:

 

创建进程时的标志,如为CREATE_SUSPENDED标志时,进程创建后自动转为挂起状态,直到调用ResumeThread为止。为0时进程创建后即运行。

 

LPDWORD lpThreadId:

 

指向接受进程标识号的变量的指针。

 

 

返回值:

 

成功时,新线程的句柄;

 

失败时,返回NULL

 

2.2 _beginthread

 

C运行函数库中的创建线程函数。与CreateThread函数相似。

 

主要有以下不同点:

 

_beginthreadC运行库函数,而CreateThreadWin32函数,故线程处理函数的指针类型不同;

 

失败时返回值不同,_beginthread返回-1,CreateThread返回0

 

CreateThread创建的线程可立即处于挂起状态,还可以设置安全描述符;

 

_beginthread的扩展_begintheadex则于CreateThread很类似。

 

2.3 线程的终止

 

1. void ExitThread (DWORD dwExitCode)

 

终止线程函数,同时释放线程占有的资源。该函数既可以显式的调用也可以在线程处理函数中调用。

 

2. BOOL TerminateThread (HANDLE hThread, DWORD dwExitCode)

 

该函数可能会引起系统不稳定,线程在用户模式下所占用的资源不能释放。

 

在调用完上述函数后,需要显式调用CloseHandle ()

 

3. _endthread ()

 

不需要显式的调用CloseHandle()

 

 

3.同步机制

 

3.1 同步对象

 

 

3.1.1 事件Event

 

Event有二种状态-激活和未激活状态。当事件处于激活状态时,在该事件上阻塞的线程被激活。

 

1. HANDLE CreateEvent (LPSECURITY_ATTRIBUTES lpEventAttributes,

 

BOOL bManualReset,

 

BOOL bInitialState,

 

LPCTSTR lpName)

 

LPSECURITY_ATTRIBUTES lpEventAttributes

 

设置Event对象的安全属性

 

BOOL bManualReset

 

TRUE,为手动模式,当事件处于激活状态时,只能显式调用ResetEvent才能改变事的的状态;

 

FALSE,为自动模式,当事件处于激活状态时,在该事件上阻塞的线程被激活,同时事件自动转入未激活状态

 

BOOL bInitialState

 

事件创建后所处的状态,TRUE为激活状态

 

LPCTSTR lpName

 

事件名

 

 

2. BOOL SetEvent (HANDLE hEvent)

 

置事件于激活状态

 

 

3. BOOL ResetEvent (HANDLE hEvent)

 

置事件于未激活状态

 

3.1.2 Timer

 

1. HANDLE CreateWaitableTimer (LPSECURITY_ATTRIBUTES lpTimerAttributes,

 

BOOL bManualReset,

 

LPCTSTR lpTimerName);

 

LPSECURITY_ATTRIBUTES lpTimerAttributes:

 

设置Timer对象的安全属性

 

BOOL bManualReset: 类似于Event

 

TRUE 手动

 

FALSE 异步Timer

 

LPCTSTR lpTimerName:

 

Timer名字

 

 

2. BOOL SetWaitableTimer(HANDLE hTimer,

 

Const LARGE_INTEGER* pDueTime,

 

LONG lPeriod,

 

PTIMERAPCROUTINE pfnCompletionRoutine,

 

LPVOID lpArgToCompletionRoutine,

 

BOOL fResume);

 

HANDLE hTimer:

 

Timer句柄

 

Const LARGE_INTEGER* pDueTime:

 

经过pDueTime时间后,Timer处于激活状态

 

LONG lPeriod:

 

lPeriod为时间间隔,周期性的使Timer处于激活状态;为零时,Timer只激活一次

 

PTIMERAPCROUTINE pfnCompletionRoutine:

 

Timer的回调函数

 

LPVOID lpArgToCompletionRoutine:

 

回调函数的参数

 

BOOL fResume:

 

TRUE,激活时如果系统处于挂起时,则恢复系统;否则不恢复

 

 

3.1.3 Mutex

 

1. HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMuteAttributes,

 

BOOL bInitialOwner,

 

LPCTSTR lpName);

 

BOOL bInitialOwner:

 

TRUE: 创建Mutex的线程拥有Mutex

 

2. BOOL ReleaseMutex(HANDLE hMutex)

 

调用该函数的线程释放Mutex的拥有权

 

 

 

3.1.4 Semaphore

 

1. HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,

 

LONG lInitialCount,

 

LONG lMaximumCount,

 

LPCTSTR lpName);

 

LONG lInitialCount:

 

LONG lMaximumCount:

 

2. e

 

3.

3.1.5 Critical Section Object

 

 

 

 

 

3.2 线程同步函数

 

当所监视的对象处于激活状态,或者时间达到所定时间戳时,阻塞的线程则激活。

 

1. DWORD WaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds)

 

HANDLE hHandle:

 

监视的对象

 

DWORD dwMilliseconds:

 

时间戳,当时间达到指定的时间戳则不管监视的对象是否激活,阻塞的线程被激活。当为INFINITE,则时间戳不起作用。

 

返回值:

 

WAIT_ABANDONED 监视对象为互斥体Mutex时,拥有Mutex对象的线程没有释放它时,置该对象为未激活

 

WAIT_OBJECT_0 激活的监视对象的状态

 

WAIT­_TIME­OUT 时间戳达到,但监视对象未激活

 

WAIT_FAILED 失败

 

 

2. DWORD WaitForMultipleObject (DWORD nCount, const HANDLE* lpHandle, BOOL bWaitAll, DWORD dwMilliseconds)

 

DWORD nCount

 

监视对象数组中的对象个数

 

const HANDLE* lpHandle

 

监视的对象数组

 

BOOL bWaitAll

 

TRUE,当且仅当监视对象都处于激活状态时返回

 

FALSE,只要有一个或多个对象激活时,函数就返回

 

DWORD dwMilliseconds

 

同上

 

返回值:

 

WAIT_OBJECT_0 bWaitAll

 

TRUE 激活的监视对象的状态

 

FALSE 对象数组中激活最小的索引值

 

WAIT­_TIME­OUT 时间戳达到,但监视对象未激活

 

WAIT_FAILED 失败

 

 

 

 

 
Windows多线程基本概念2
 
4. 实例研究

 

 

5. 参考文献

 

1. Windows平台下的多线程编程, http://www2.ccw.com.cn/02/0244/d/0244d04_1.asp

 

2. Windows 95 多线程间同步事件的控制方法http://www.ddvip.net/program/C++/index14/47.htm

 

3. MSDN

 

 

 

6. 术语

 

Mutex 互斥体

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

同步对象

 

拥有者

 

进入非激活状态

 

用途

 

备注

 

Event

 

多个线程

 

可是进程间(OpenXXX函数)

 

手动

 

显示调用

 

事件触发

 

 


自动

 

阻塞线程激活后

 

Timer

 

多个线程

 

手动

 

显示调用

 

定时器到时

 

 


异步

 

阻塞线程激活后

 

Semaphore

 

Count个线程

 

资源Count计数为零时

 

 


重复调用,资源Count

 

Mutex

 

1个线程

 

阻塞线程激活后

 

互访问

 

重复调用Wait不阻塞

 

Critical Section

 

1个线程(进程内)

 

 


互访问

 

高,重复调用不阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值