CreateThread(&security_attributes,dwStackSize,ThreadProc,pParam,dwFlags,&idThread):第一个参数是SECURITY_ATTRIBUTES指针,Windows 98忽略这个参数,Windows NT中也可为NULL。第二个参数是初始栈大小,0表示默认值。第三个参数是线程函数指针,ThreadProc必须按以下方式声明
DWORD WINAPI ThreadProc(PVOID pParam)。
第四个参数是ThreadProc的参数,dwFlags一般为0,如果为CREATE_SUSPENDED,线程被创建后并不会立即执行,而要等到调用ResumeThread。最后一个参数是变量指针,返回线程ID。
_beginthread(ThreadProc,uiStackSize,pParam):Windows C语言库函数,可以完成大部分多线程应用需求,ThreadProc必须定义为
void __cdecl ThreadProc(void * pParam)。
_endthread():退出线程,写在线程函数最后一行。如果线程结束时程序也结束,这个函数不是必须要调用。
临界区
InitializeCriticalSection(&cs):cs是CRITICAL_SECTION结构体变量,使用前必须初始化。
EnterCriticalSection(&cs):进入临界区。
LeaveCriticalSection(&cs):离开临界区。
DeleteCriticalSection(&cs):删除临界区。
临界区只能在同一进程内部使用,cs不能被移动、拷贝和人为修改。
互斥体
CreateMutex
OpenMutex
RealeaseMutex
CloseHandle
可以在不同应用程序的线程之间实现对资源的完全共享。
信号量
CreateSemaphore
事件对象
CreateEvent(&sa,fManual,fInitial,pszName):第一个参数是SECURITY_ATTRIBUTES结构体指针,最后一个参数是事件对象的名字,这两个参数只有在进程间线程互斥才有意义,对于单个进程内部的线程互斥两个值都为NULL。fInitial为TRUE则事件对象初始化为有信号状态,否则初始化为无信号状态。fManual设置事件对象的两种模式:自动重置和人工重置。
SetEvent(hEvent):置hEvent为有信号状态
ResetEvent(hEvent):置hEvent为无信号状态
WaitForSingleObject(hEvent,dwTimeOut):如果第二个参数取INFINITE,hEvent有信号则该函数才返回。如果这个参数设定一个值,该函数最多等待hEvent有信号dwTimeOut毫秒。如果CreateEvent中fManual为FALSE,则hEvent自动被置无信号状态。WaitForSingleObject可以还可以等待的对你对Mutex、Semaphore、Process、Thread。
TLS(Thread Local Storage)
全局变量可以被所有线程共享。局部静态变量被使用同一函数的线程共享。局部动态变量只能被一个线程使用,因为局部动态变量分配在栈上,而每个线程都有自己的栈。
TLS变量可以被所有线程使用,每个线程都有自己独立的值。
TlsAlloc():返回一个索引值(DWORD),这个值可用做全局变量或CreateThread供线程使用。
TlsSetValue(dwTlsIndex,value):第二个TLS变量为指针,则用GlobalAlloc分配空间,value为GlobalAlloc返回值。
TlsGetValue(dwTlsIndex):线程退出前要释放内存空间。GlobalFree(TlsGetValue(dwTlsIndex))
TlsFree(dwTlsIndex):所有线程结束后,释放索引。
微软对C的扩展使用TLS变量像普通变量一样使用。使每个线程变量值都不一样,则声明为:
__declspec(thread) int iGlobal=1;
定义为静态变量刚每个函数的变量值不同:
__declspec(thread) static int iLocal=2;