windows系统下互斥量使用与特性总结

 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下不是这样的)。

好吧!暂时记录这么一点吧,后面有问题再补充完善。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值