多线程

来源:互联网 发布:mac gdb 动态调试 编辑:程序博客网 时间:2024/04/28 15:19

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;

原创粉丝点击