1.互斥量相关接口
HANDLE WINAPI CreateMutex(_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, _In_ BOOL bInitialOwner, _In_opt_ LPCSTR lpName);
DWORD WINAPI WaitForSingleObject(_In_ HANDLE hHandle, _In_ DWORD dwMilliseconds);
HANDLE WINAPI OpenMutex(_In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ LPCSTR lpName);
BOOL WINAPI ReleaseMutex(_In_ HANDLE hMutex);
2.使用特性
#include<Windows.h>
#include<stdio.h>
#include<stdlib.h>
HANDLE hThread = NULL, hMutex = NULL;
int main(int argc, char *argv[])
{
hMutex = ::CreateMutex(NULL, FALSE, NULL);
if (NULL == hMutex) {
return 0;
}
::WaitForSingleObject(hMutex, INFINITE);
::WaitForSingleObject(hMutex, INFINITE);
::ReleaseMutex(hMutex);
::CloseHandle(hThread);
system("pause");
return 0;
}
上面这段代码接连调用了两次WaitForSingleObject函数,我们会想程序应该会永远阻塞在第二个调用上,但执行程序后并没有阻塞。这里我的一点使用感受:互斥量每次被置为非授信状态的时候都是和调用线程相关的(这里包括初始化的时候),在线程中将互斥量置为非授信状态的时候,底层调用首先会检查此互斥量是否已经在当前线程中被置为非授信状态,如果是则直接返回,如果不是在当前线程将会阻塞等待。
#include<Windows.h>
#include<stdio.h>
#include<stdlib.h>
HANDLE hThread = NULL, hMutex = NULL;
DWORD WINAPI Tproc1(void *lparam);
int main(int argc, char *argv[])
{
hMutex = ::CreateMutex(NULL, FALSE, NULL);
if (NULL == hMutex) {
return 0;
}
hThread = ::CreateThread(NULL, 0, Tproc1, NULL, 0, NULL);
if (NULL == hThread) {
return 0;
}
Sleep(1000);
::TerminateThread(hThread, 0);
::WaitForSingleObject(hMutex, INFINITE);
::ReleaseMutex(hMutex);
::CloseHandle(hThread);
system("pause");
return 0;
}
DWORD WINAPI Tproc1(void *lparam)
{
::WaitForSingleObject(hMutex, INFINITE);
Sleep(3000);
::ReleaseMutex(hMutex);
return 0;
}
这一段代码首先在子线程中将互斥量置为非授信状态,接着强制其退出,原本预想结果是程序会一直阻塞在主线程,但实际情况并不是这样的,由此可知,线程推出时其占有的互斥量也会被释放(这个特性在Linux下不是这样的)。
好吧!暂时记录这么一点吧,后面有问题再补充完善。