前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CreateMutex WaitForSingleObject ReleaseMutex使用「建议收藏」

CreateMutex WaitForSingleObject ReleaseMutex使用「建议收藏」

作者头像
全栈程序员站长
发布2022-09-13 15:02:04
2040
发布2022-09-13 15:02:04
举报
文章被收录于专栏:全栈程序员必看

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

HANDLE CreateMutex(

LPSECURITY_ATTRIBUTES lpMutexAttributes,//

BOOL bInitialOwner, // flag for initial ownership

LPCTSTR lpName // pointer to mutex-object name

);

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

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

代码语言:javascript
复制
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.cn/153184.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档