CreateMutex WaitForSingleObject ReleaseMutex使用「建议收藏」

CreateMutex WaitForSingleObject ReleaseMutex使用「建议收藏」HANDLECreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes,// BOOLbInitialOwner, //flagforinitialownership LPCTSTRlpName    //pointertomutex-objectname );

大家好,又见面了,我是你们的朋友全栈君。

HANDLE CreateMutex(

 LPSECURITY_ATTRIBUTES lpMutexAttributes,//

 BOOL bInitialOwner,  // flag for initial ownership

 LPCTSTR lpName     // pointer to mutex-object name

 );

参数2:指示互斥对象的初始拥有者。 如果该值是真,调用者创建互斥对象,调用的线程获得互斥对象的所有权。 否则,不拥有所有权,此时互斥对象处于空闲状态,其他线程可以占用。

(-)  主线程中创建拥有所有权的互斥量,两个子线程中分别等待互斥量-》没有输出

DWORD WINAPI ThreadProc1(LPVOID lpParameter);
DWORD WINAPI ThreadProc2(LPVOID lpParameter);

int    ticket = 50;
HANDLE hMutex = NULL;

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE handle1 = CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
	HANDLE handle2 = CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);

	CloseHandle(handle1);
	CloseHandle(handle2);

	hMutex = CreateMutex(NULL,TRUE,NULL); //第二个参数为TRUE,互斥对象的所有权为主线程所有,非空闲状态

	Sleep(4000);

	return 0;
}

DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{

	//WaitForSingleObject(hMutex,INFINITE); //第二个参数为INFINITE表示一直等待,直到拥有互斥对象
	while(TRUE)
	{

		WaitForSingleObject(hMutex,INFINITE); //第二个参数为INFINITE表示一直等待,直到拥有互斥对象

		if ( ticket > 0 )
		{
			Sleep(1);

		    printf("thread1 sale the ticket id is: %d\n", ticket--);
		}
		else
		{
			break;
		}                 

		ReleaseMutex(hMutex); //使用完了,将互斥对象还给操作系统
	}
	//ReleaseMutex(hMutex); //使用完了,将互斥对象还给操作系统
	return 0;
} 

DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{

	while(TRUE)
	{

		WaitForSingleObject(hMutex,INFINITE); //第二个参数为INFINITE表示一直等待,直到拥有互斥对象         

		if ( ticket > 0 )
		{

		   Sleep(1);

		   printf("thread2 sale the ticket id is: %d\n", ticket--);

		}
		else
		{
			break;
		}        

		ReleaseMutex(hMutex); //使用完了,将互斥对象还给操作系统
    }

	return 0;
}


(二)  主线程中创建没有所有权的互斥量,两个子线程中分别等待互斥量-》输出如下

thread1 sale the ticket id is: 50
thread2 sale the ticket id is: 49
thread1 sale the ticket id is: 48
thread2 sale the ticket id is: 47
thread1 sale the ticket id is: 46
thread2 sale the ticket id is: 45
thread1 sale the ticket id is: 44
thread2 sale the ticket id is: 43
thread1 sale the ticket id is: 42
thread2 sale the ticket id is: 41
thread1 sale the ticket id is: 40
thread2 sale the ticket id is: 39
thread1 sale the ticket id is: 38
thread2 sale the ticket id is: 37
thread1 sale the ticket id is: 36
thread2 sale the ticket id is: 35
thread1 sale the ticket id is: 34
thread2 sale the ticket id is: 33
thread1 sale the ticket id is: 32
thread2 sale the ticket id is: 31
thread1 sale the ticket id is: 30
thread2 sale the ticket id is: 29
thread1 sale the ticket id is: 28
thread2 sale the ticket id is: 27
thread1 sale the ticket id is: 26
thread2 sale the ticket id is: 25
thread1 sale the ticket id is: 24
thread2 sale the ticket id is: 23
thread1 sale the ticket id is: 22
thread2 sale the ticket id is: 21
thread1 sale the ticket id is: 20
thread2 sale the ticket id is: 19
thread1 sale the ticket id is: 18
thread2 sale the ticket id is: 17
thread1 sale the ticket id is: 16
thread2 sale the ticket id is: 15
thread1 sale the ticket id is: 14
thread2 sale the ticket id is: 13
thread1 sale the ticket id is: 12
thread2 sale the ticket id is: 11
thread1 sale the ticket id is: 10
thread2 sale the ticket id is: 9
thread1 sale the ticket id is: 8
thread2 sale the ticket id is: 7
thread1 sale the ticket id is: 6
thread2 sale the ticket id is: 5
thread1 sale the ticket id is: 4
thread2 sale the ticket id is: 3
thread1 sale the ticket id is: 2
thread2 sale the ticket id is: 1

(三)  主线程中创建没有所有权的互斥量,主线程和子线程中分别等待互斥量-》主线程和子线程交替输出

(四)  主线程中创建拥有所有权的互斥量,主线程和子线程中分别等待互斥量-》只有主线程输出

这个原因不知道如何解释,难道在主线程中创建有所有权的,其他线程就永远等待不到了吗

(五) 子线程中创建拥有所有权的互斥量,主线程和子线程中分别等待互斥量-》只有子线程输出

(四)和(五)的结果可以说明在哪个线程中创建拥有所有权的互斥量,所有权永远被此线程占有,即使释放了互斥量。

以上结果都在Wince6.0测试。

后来找到一个 说明,貌似可以说明以上结论呢:

如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有。是FALSE,表示刚刚创建的这个Mutex不属于任何线程 也就是没有任何线程拥有他,一个Mutex在没有任何线程拥有他的时候,他是处于激发态的, 所以处于有信号状态。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153184.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js中clientWidth、scrollLeft、offsetX等宽高度和位置的用法

    js中clientWidth、scrollLeft、offsetX等宽高度和位置的用法文章目录前言一、clientWidth/clientHeight二、clientLeft/clientTop三、clientX/clientY四、scrollWidth/scrollHeight五、scrollLeft/scrollTop六、offsetWidth/offsetHeight七、offsetLeft/offsetTop八、offsetX/offsetY总结前言前端学习中会遇到的一些宽高度,位置的计算提示:以下是本篇文章正文内容,下面案例可供参考.b.

    2022年7月22日
    9
  • spdlog linux编译出错,【C++】spdlog–log4cxx有点笨重,试一试spdlog

    spdlog linux编译出错,【C++】spdlog–log4cxx有点笨重,试一试spdlogspdlog是什么linuxFastC++logginglibrary按照官方介绍,是一个高性能的C++日志组件,支持跨平台,兼容C++11。原来项目中使用的是log4cxx,我感受稍微有点笨重,而且好久没有更新了。ios在新项目中,我只须要一款轻量级的日志组件,能:git存文件按照天数切分快速的浏览了spdlog,知足个人需求,因而开搞!githubspdlog快速入门如下内容来自spd…

    2022年6月23日
    52
  • (一)EGE介绍[通俗易懂]

    (一)EGE介绍[通俗易懂]EGE图形库的介绍

    2025年10月28日
    2
  • 跨平台移动APP开发进阶(二):HTML5+、mui开发移动app教程[通俗易懂]

    跨平台移动APP开发进阶(二):HTML5+、mui开发移动app教程[通俗易懂]前端开发APP,从HBuilder开始~序通过HTML5开发移动App时,会发现HTML5很多能力不具备。为弥补HTML5能力的不足,在W3C中国的指导下成立了www.HTML5Plus.org组织,推出HTML5+规范。HTML5+扩展了JavaScript对象plus,使得js可以调用各种浏览器无法实现或实现不佳的系统能力,设备能力如摄像头

    2022年5月31日
    37
  • 初识Zigbee协议栈及其安装

    初识Zigbee协议栈及其安装1.什么是Zigbee协议栈?什么是ZigBee协议栈呢?它和ZigBee协议有什么关系呢?协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议的,进而实现无线数据收发。ZigBee的协议分为两部分,IEEE802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范;ZigBee联盟定义了NWK(网络层)、APS(

    2022年5月8日
    40
  • PHP个人博客系统开发历程

    PHP个人博客系统开发历程

    2021年11月14日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号