Windows多线程同步系列之一-----互斥对象
lpName[in] Pointer to a null-terminated string specifying the name of the mutex object. The name is limited to MAX_PATH characters. Name comparison is case sensitive.
If lpName matches the name of an existing named mutex object, this function requests MUTEX_ALL_ACCESS access to the existing object. In this case, thebInitialOwner parameter is ignored because it has already been set by the creating process. If the lpMutexAttributes parameter is not NULL, it determines whether the handle can be inherited, but its security-descriptor member is ignored.
If lpName is NULL, the mutex object is created without a name.
If lpName matches the name of an existing event, semaphore, waitable timer, job, or file-mapping object, the function fails and the GetLastError function returns ERROR_INVALID_HANDLE. This occurs because these objects share the same name space.
Terminal Services: The name can have a "Global\" or "Local\" prefix to explicitly create the object in the global or session name space. The remainder of the name can contain any character except the backslash character (\). For more information, see Kernel Object Name Spaces.
参数lpName指定是一个命名的互斥对象还是一个匿名的互斥对象,它们之间的区别我们留待后面再学习
该函数释放互斥对象的所有权,也就是说该函数将互斥对象置为有信号的状态该函数的参数即为CreateMutex函数返回的句柄对象
在利用互斥事件进行线程同步的时候我们还需要使用一个函数WaitForSingleObject该函数将等待互斥对象有状态才返回否则一直阻塞。
#include <windows.h> #include <stdio.h> static int number=10; HANDLE Mutex; DWORD WINAPI ThreadOne(LPVOID lpParameter) { while(1) { WaitForSingleObject(Mutex,INFINITE); if(number>0) { printf("窗口1售出第%d张票...\n",number); number--; Sleep(1000); } ReleaseMutex(Mutex); } return 0; } DWORD WINAPI ThreadTwo(LPVOID lpParameter) { while(1) { WaitForSingleObject(Mutex,INFINITE); if(number>0) { printf("窗口2售出第%d张票...\n",number); Sleep(1000); number--; } ReleaseMutex(Mutex); } return 0; } int main() { HANDLE HOne,HTwo; Mutex=CreateMutex(NULL,FALSE,NULL); printf("***********************vpoet******************\n"); HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL); printf("窗口1售票开始:\n"); HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL); printf("窗口2售票开始:\n"); CloseHandle(HOne); CloseHandle(HTwo); while(TRUE) { if(number==0) { printf("不好意思,票卖完了!\n"); CloseHandle(Mutex); return 0; } else { continue; } } return 0; }
运行结果:
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。