window信号量、互斥、自旋锁

来源:互联网 发布:java基础 学javascript 编辑:程序博客网 时间:2024/05/18 19:20
1、EnterCriticalSection():
等待对共享区域的获取,当获取到此函数立即返回Critical_Section用来对线程之间的同步,在使用之前必须对共享区域进行初始化,InitializeCriticalSection和IniticlizeCriticalSectionAndSpinCount进行初始化
bool WINAPI IniticalizeCriticalSectionAndSpinCount(CRITICAL_SECTION *critialsection,DWORD dwSpinCount)
critialsection:共享资源
dwSpinCount:
当线程进入共享内存,每个线程调用EnterCriticalSection或者TryEnterCriticalSection去请求获取对共享内存的使用权。
EnterCriticalSection:如果没有获得则阻塞直到获取
TryEnterCriticalSection:不管获得与否,立即返回
当一个线程使用完毕后,使用LeaveCriticalSection函数释放使用权,线程可以使用DeleteCriticalSection释放共享资源,释放之后将不能够用于同步。

具体流程例如:

CRITICAL_SECTION CriticalSection;

//初始化
IniticalizeCriticalSectionAndSpinCount(&CriticalSection,0);
//请求
EnterCriticalSection(&Critical);
ReleaseCriticalSection(&Critical);
//释放资源
DeleteCriticalSection(&Critical);

2、CreateMutex
HANDLE WINAPI CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAtteibutes,
BOOL bInitialOwner,
LPCTSTR loName
)
lpMutexAttributes:指向SECURITY_ATTRIBUTES,如果为0,则handle不能为子进程继承
bInitialOwner:TRUE表示调用者拥有Mutex对象
lpName:NULL,或者填
返回:新的handle,失败返回NULL,用GetLastError()

3、CreateSemaphore
HANDLE WINAPI CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG LInitialCount,
LONG LMximumCount,
LPCTST lpName
)
lpSemaphoreAttributes:指向SECURITY_ATTRIBUTES,为零不被子进程进程
IInitialCount:初始值
IMaximumCount:最大值
lpName:名字

返回:新的handle,失败返回NULL

4、WaitForSingleObject
DWORD WINAPI WaitForSingleObject(HANDLE handle,DWORD dwMillseconds)
handle:等待对象
dwMillseconds:等待时间,单位毫秒。为0函数立即返回,INIFINITE一直等待
返回值:
WAIT_ABANDONED:互斥锁等未被释放,阻塞
WAIT_OBJECT_0:等待的信号出现
WAIT_TIMEOUT:超时

#include <Windows.h>
DWORD WINAPI ThreadFunc(LPVOID);HANDLE ghSemaphore;HANDLE ghMutex;DWORD WINAPI WriteToDatabase(LPVOID);int main(int argc, char *argv[])  {ghSemaphore=CreateSemaphore(NULL,1,10,NULL);if(ghSemaphore==NULL){printf("CreateSemaphore error:%d\n",ghSemaphore);return 0;}HANDLE hThrd;DWORD threadId1;int i;for(i=0;i<1;i++){hThrd=CreateThread(NULL,0,ThreadFunc,(LPVOID)i,0,&threadId1);if(hThrd){printf("Thread launched %d\n",i);CloseHandle(hThrd);}}char st[13]={0};while(fgets(st,13,stdin)){if(strcmp(st,"n\n")==0){ReleaseSemaphore(ghSemaphore,1,NULL);}}HANDLE aThread[5];DWORD ThreadID2;ghMutex=CreateMutex(NULL,FALSE,NULL);if(ghMutex==NULL){printf("CreateMutex error:%d\n",GetLastError());}for(int i=0;i<5;i++){aThread[i]=CreateThread(NULL,NULL,WriteToDatabase,NULL,0,&ThreadID2);if(aThread[i]==NULL){printf("CreateThread error:%d\n",GetLastError());return 0;}}WaitForMultipleObjects(5,aThread,TRUE,INFINITE);for(int i=0;i<5;i++){CloseHandle(aThread[i]);}CloseHandle(ghMutex);getchar();return 0;  }  DWORD WINAPI WriteToDatabase(LPVOID){DWORD dwCount=0,dwWaitResult;while(dwCount<5){dwWaitResult=WaitForSingleObject(ghMutex,INFINITE);switch(dwWaitResult){case WAIT_OBJECT_0:_try{printf("Thread %d writing to the database...\n",GetCurrentThreadId());dwCount++;}_finally{if(!ReleaseMutex(ghMutex)){//}}break;case WAIT_ABANDONED:return FALSE;}}return TRUE;}DWORD WINAPI ThreadFunc(LPVOID n){DWORD dwWaitResult;BOOL bContinue=TRUE;while(bContinue){dwWaitResult=WaitForSingleObject(ghSemaphore,1000);switch (dwWaitResult){case WAIT_OBJECT_0:printf("Thread %d: wait signaled\n",GetCurrentThreadId());Sleep(2500);if(!ReleaseSemaphore(ghSemaphore,1,NULL)){printf("ReleaseSemaphore error:%d \n",GetLastError());}break;case WAIT_TIMEOUT:printf("Thread %d: wait timed out\n",GetCurrentThreadId());break;}}return TRUE;}
没有对具体的机制进行解释,等过一段时间测试补充

0 0