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函数相似。
主要有以下不同点:
_beginthread是C运行库函数,而CreateThread是Win32函数,故线程处理函数的指针类型不同;
失败时返回值不同,_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_TIMEOUT 时间戳达到,但监视对象未激活
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_TIMEOUT 时间戳达到,但监视对象未激活
WAIT_FAILED 失败
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函数相似。
主要有以下不同点:
_beginthread是C运行库函数,而CreateThread是Win32函数,故线程处理函数的指针类型不同;
失败时返回值不同,_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_TIMEOUT 时间戳达到,但监视对象未激活
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_TIMEOUT 时间戳达到,但监视对象未激活
WAIT_FAILED 失败
C运行函数库中的创建线程函数。与CreateThread函数相似。
主要有以下不同点:
_beginthread是C运行库函数,而CreateThread是Win32函数,故线程处理函数的指针类型不同;
失败时返回值不同,_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_TIMEOUT 时间戳达到,但监视对象未激活
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_TIMEOUT 时间戳达到,但监视对象未激活
WAIT_FAILED 失败
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_TIMEOUT 时间戳达到,但监视对象未激活
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_TIMEOUT 时间戳达到,但监视对象未激活
WAIT_FAILED 失败
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_TIMEOUT 时间戳达到,但监视对象未激活
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_TIMEOUT 时间戳达到,但监视对象未激活
WAIT_FAILED 失败
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_TIMEOUT 时间戳达到,但监视对象未激活
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_TIMEOUT 时间戳达到,但监视对象未激活
WAIT_FAILED 失败
3.2 线程同步函数
当所监视的对象处于激活状态,或者时间达到所定时间戳时,阻塞的线程则激活。
1. DWORD WaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds)
HANDLE hHandle:
监视的对象
DWORD dwMilliseconds:
时间戳,当时间达到指定的时间戳则不管监视的对象是否激活,阻塞的线程被激活。当为INFINITE,则时间戳不起作用。
返回值:
WAIT_ABANDONED 监视对象为互斥体Mutex时,拥有Mutex对象的线程没有释放它时,置该对象为未激活
WAIT_OBJECT_0 激活的监视对象的状态
WAIT_TIMEOUT 时间戳达到,但监视对象未激活
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_TIMEOUT 时间戳达到,但监视对象未激活
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个线程(进程内)
互访问
高,重复调用不阻塞
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个线程(进程内)
互访问
高,重复调用不阻塞
同步对象
拥有者
进入非激活状态
用途
备注
Event
多个线程
可是进程间(OpenXXX函数)
手动
显示调用
事件触发
自动
阻塞线程激活后
Timer
多个线程
手动
显示调用
定时器到时
异步
阻塞线程激活后
Semaphore
Count个线程
资源Count计数为零时
重复调用,资源Count减
Mutex
1个线程
阻塞线程激活后
互访问
重复调用Wait不阻塞
Critical Section
1个线程(进程内)
互访问
高,重复调用不阻塞