如果想精通WIN下的多线程编程,需要很好的线程原理的基础,但是如果只想初步应用WIN下的多线程的API,这篇文章还是有用的,我目前的情况,也仅是初步使用,而且够用
注意本文没有对 事件 对象进行说明,因为本人暂时没有用到
BOOL WINAPI CloseHandle(
_In_ HANDLE hObject
);
用于关闭(释放)windows句柄:
hObject: 必需是有效的windows句柄
DWORD WINAPI WaitForSingleObject(
_In_ HANDLE hHandle,
_In_ DWORD dwMilliseconds
);
用于等待某个句柄的信号,我一般这样设置参数:
hHandle: 必需是有效的windows句柄
dwMilliseconds: 超时参数(INFINITE 超时时间为无限大)
DWORD WINAPI 函数名字(LPVOID lpParameter);
static DWORD WINAPI 函数名字(LPVOID lpParameter);
线程入口函数的形式,其中第一种形式必需是全局的,第二种形式可用于类中
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
用于创建一个线程,我一般会设置两个参数:
lpStartAddress: 线程入口函数地址
lpParameter: 线程入口函数的参数
其它参数使用默认值:
lpThreadAttributes: NULL
dwStackSize: 0
dwCreationFlags: 0
lpThreadId: NULL
必需使用 CloseHandle 关闭句柄
如果线程主函数退出会触发一个信号,WaitForSingleObject会返回
HANDLE WINAPI CreateMutex(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
_In_ BOOL bInitialOwner,
_In_opt_ LPCTSTR lpName
);
用于创建互斥锁,一般使用默认值:
lpMutexAttributes: NULL
bInitialOwner: false
lpName: NULL
必需使用 CloseHandle 关闭句柄
BOOL WINAPI ReleaseMutex(
_In_ HANDLE hMutex
);
用于释放锁, 参数设置如下:
hMutex: 必需是有效的windows句柄
CreateMutex和ReleaseMutex都会触发一个信号,WaitForSingleObject会返回
HANDLE WINAPI CreateSemaphore(
_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
_In_ LONG lInitialCount,
_In_ LONG lMaximumCount,
_In_opt_ LPCTSTR lpName
);
用于创建信号量,我一般会设置两个参数:
lInitialCount: 信号量的初使值
lMaximumCount: 信号量的最大值
其它参数使用默认值:
lpSemaphoreAttributes: NULL
lpName: NULL
必需使用 CloseHandle 关闭句柄
BOOL WINAPI ReleaseSemaphore(
_In_ HANDLE hSemaphore,
_In_ LONG lReleaseCount,
_Out_opt_ LPLONG lpPreviousCount
);
用于释放信号量,参数一般设置如下:
hSemaphore: 必需是有效的windows句柄
lReleaseCount: 释放的个数(一般设置为1)
其它参数采用默认值:
lpPreviousCount: NULL
CreateSemaphore和ReleaseSemaphore都会触发一个信号,WaitForSingleObject会返回
CRITICAL_SECTION: 临界区对象
void WINAPI InitializeCriticalSection(
_Out_ LPCRITICAL_SECTION lpCriticalSection
);
用于初使化临界区对象,参数设置如下:
lpCriticalSection: 临界区对象指针
void WINAPI DeleteCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
用于释放临界区对象,参数设置如下:
lpCriticalSection: 临界区对象指针
void WINAPI EnterCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
用于进入临界区,参数设置如下:
lpCriticalSection: 临界区对象指针
BOOL WINAPI TryEnterCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
尝试进入临界区,如果成功返回TRUE,如果失败返回FALSE,参数设置如下:
lpCriticalSection: 临界区对象指针
void WINAPI LeaveCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
用于离开临界区,参数设置如下:
lpCriticalSection: 临界区对象指针
CONDITION_VARIABLE: 条件变量对象
条件变量对象不需要Delete
VOID WINAPI InitializeConditionVariable(
_Out_ PCONDITION_VARIABLE ConditionVariable
);
用于初使化条件变量对象,参数设置如下:
ConditionVariable: 条件变量对象指针
BOOL WINAPI SleepConditionVariableCS(
_Inout_ PCONDITION_VARIABLE ConditionVariable,
_Inout_ PCRITICAL_SECTION CriticalSection,
_In_ DWORD dwMilliseconds
);
用于Sleep一个条件变量对象,参数设置如下:
ConditionVariable: 条件变量对象的地址
CriticalSection: 临界区对象的地址
dwMilliseconds: 超时参数(INFINITE 超时时间为无限大)
VOID WINAPI WakeConditionVariable(
_Inout_ PCONDITION_VARIABLE ConditionVariable
);
用于Wake一个线程的条件变量对象,参数设置如下:
ConditionVariable: 条件变量对象的地址
VOID WINAPI WakeAllConditionVariable(
_Inout_ PCONDITION_VARIABLE ConditionVariable
);
用于Wake所有线程的条件变量对象,参数设置如下:
ConditionVariable: 条件变量对象的地址
BOOL WINAPI SleepConditionVariableSRW(
_Inout_ PCONDITION_VARIABLE ConditionVariable,
_Inout_ PSRWLOCK SRWLock,
_In_ DWORD dwMilliseconds,
_In_ ULONG Flags
);
用于和读写锁一起使用,暂时不作要求