windows线程同步对象mutex
2023-01-11 本文已影响0人
CodingCode
-
什么是mutex
首先mutex是一个内核对象,不但可以用来做线程同步,还可以用来做进程间同步。 -
基本API
2.1 创建mutext
HANDLE aMutex = CreateMutex(NULL, FALSE, "abcd");
- 3rd参数是mutex名字,如果在同一个进程内的多线程之间可以是空串,即不需要指定;但如果是多进程之间通信,通常需要指定名字,否则进程之间无法获取同一个mutex。
- CreateMutex创建一个mutex,如果名字对应的mutex已经存在了,则打开的;于此相对于的OpenMutex则只是打开,不会创建。
2.2 等待一个mutex
DWORD ret = WaitForSingleObject(aMutex, INFINITE);
这个地方需要注意的是:
- 只有对方ReleaseMutex了,那么Wait才能返回。
- 如果对方没有ReleaseMutex,而直接调用CloseHandle,那么Wait也是不会返回的。
- 如果对方直接进程退出了,那么Wait是可以返回的,但是返回值是:WAIT_ABANDONED (https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitforsingleobject)
2.3 释放mutex
ReleaseMutex(child_mutex);
ReleaseMutex是和WaitXXX匹配使用的。
2.4 关闭mutex
CloseHandle(child_mutex);