关闭

多线程同步之互斥对象

标签: 多线程互斥
2481人阅读 评论(0) 收藏 举报
分类:
多线程同步之互斥对象

作者:vpoet
mail:18200268879@163.com




对卖票问题进行线程间同步,本文将在上文的基础上,使用互斥对象对线程进行同步。



首先看看windows API


该函数创建一个命名或者不命名的互斥对象


lpMutexAttributes
[in] Pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle can be inherited by child processes. If lpMutexAttributes is NULL, the handle cannot be inherited. 
参数lpMutexAttributes为互斥对象的安全属性,如果为NULL,则使用默认的安全属性

bInitialOwner
[in] Specifies the initial owner of the mutex object. If this value is TRUE and the caller created the mutex, the calling thread obtains ownership of the mutex object. Otherwise, the calling thread does not obtain ownership of the mutex. To determine if the caller created the mutex, see the Return Values section. 
参数bInitialOwner指定该互斥对象的拥有者,若为TRUE则表明创建互斥对象的线程对其有所有权,而反之则表示创建互斥对象的线程不能对其拥有所有权


lpName
[in] Pointer to a null-terminated string specifying the name of the mutex object. The name is limited to MAX_PATH characters. Name comparison is case sensitive.

If lpName matches the name of an existing named mutex object, this function requests MUTEX_ALL_ACCESS access to the existing object. In this case, thebInitialOwner parameter is ignored because it has already been set by the creating process. If the lpMutexAttributes parameter is not NULL, it determines whether the handle can be inherited, but its security-descriptor member is ignored.

If lpName is NULL, the mutex object is created without a name.

If lpName matches the name of an existing event, semaphore, waitable timer, job, or file-mapping object, the function fails and the GetLastError function returns ERROR_INVALID_HANDLE. This occurs because these objects share the same name space.

Terminal Services: The name can have a "Global\" or "Local\" prefix to explicitly create the object in the global or session name space. The remainder of the name can contain any character except the backslash character (\). For more information, see Kernel Object Name Spaces


参数lpName指定是一个命名的互斥对象还是一个匿名的互斥对象,它们之间的区别我们留待后面再学习





该函数释放互斥对象的所有权,也就是说该函数将互斥对象置为有信号的状态
该函数的参数即为CreateMutex函数返回的句柄对象




在利用互斥事件进行线程同步的时候我们还需要使用一个函数WaitForSingleObject该函数将等待互斥对象有状态才返回否则一直阻塞。

接下来我们来实际动手看看,注意在CreateMutex函数的第二个参数我们置为FALSE,因为我们需要在主线程中创建该互斥对象,但是把这个
互斥对象的所有权需要轮换的交给两个子线程交替的卖票。

代码如下:

#include <windows.h>
#include <stdio.h>

static int number=10;
HANDLE Mutex;

DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(Mutex,INFINITE);  
		if(number>0)
		{
			printf("窗口1售出第%d张票...\n",number);
			number--;
			Sleep(1000);		
		}
		ReleaseMutex(Mutex);	
	}
	return 0;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(Mutex,INFINITE);
		if(number>0)
		{
			printf("窗口2售出第%d张票...\n",number);
			Sleep(1000);
			number--;
		}
		ReleaseMutex(Mutex);
	}
	return 0;
}


int main()
{
	HANDLE HOne,HTwo;
	Mutex=CreateMutex(NULL,FALSE,NULL);
	printf("***********************vpoet******************\n");
	HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);
	printf("窗口1售票开始:\n");
	HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);
	printf("窗口2售票开始:\n");
	CloseHandle(HOne);
	CloseHandle(HTwo);
	while(TRUE)
	{
		if(number==0)
		{
			printf("不好意思,票卖完了!\n");
			CloseHandle(Mutex);
			return 0;
		}
		else
		{
			continue;
		}	
	}

	return 0;
}

运行结果:


嗯 没问题,达到我们要求了。

Ok,下次博文我们再一起学习使用事件对象进行线程间同步。
1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

<MFC笔记> 四种线程同步(或互斥)方式小结

一,什么是线程同步? 同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。这里的同步千万不要理解成那个同时进行,应是指协同、协助、互相配合。 线程同步是指多线程通过特定的设置(如互斥量,...
  • EbowTang
  • EbowTang
  • 2014-06-10 21:35
  • 1993

JAVA多线程机制之同步与互斥

一个多线程的程序,两个或者多个线程可能需要访问同一个数据资源。这时就必须考虑数据安全的问题,需要线程互斥或者同步。线程的互斥当多个线程需要访问同一资源时,要求在一个时间段内只能允许一个线程来操作共享资...
  • jianggujin
  • jianggujin
  • 2016-01-04 20:12
  • 3444

线程同步之互斥对象(通俗易懂)

先看售票系统的程序,看看多线程容易出什么问题: #include #include DWORD WINAPI Fun1Proc(LPVOID lpParameter); DWORD WINAPI...
  • stpeace
  • stpeace
  • 2013-10-03 16:56
  • 3001

多线程同步-互斥对象(深入理解Mutex)

多线程之线程同步Mutex (功能与Critial Sections相同,但是属于内核对象,访问速度较慢,可以被不同进程调用) 一 Mutex     互斥对象(mutex)内核对象能够确保线程拥有...
  • zhang_sinner
  • zhang_sinner
  • 2015-02-11 15:54
  • 1318

C++多线程同步(采用互斥对象Mutex)

C++多线程同步(采用互斥对象Mutex)
  • hk627989388
  • hk627989388
  • 2016-11-25 12:04
  • 272

windows下多线程同步(利用事件对象,互斥对象,关键代码段)实现

一:利用事件实现线程同步   1.createthread函数的用法 hThread = CreateThread(&security_attributes, dwStackSize, ThreadP...
  • zkpingguo
  • zkpingguo
  • 2015-05-30 22:17
  • 389

多线程同步:互斥对象、事件对象、关键代码段

互斥对象、事件对象、关键代码段     一、互斥对象和事件对象属于内核对象,利用内核对象进行线程同步,速度较慢,但可以实现在多个进程中各线程间进行同步。     二、关键代...
  • kaida1234
  • kaida1234
  • 2016-06-30 17:23
  • 247

多线程同步:互斥对象、事件对象、关键代码段

互斥对象、事件对象、关键代码段 一、互斥对象和事件对象属于内核对象,利用内核对象进行线程同步,速度较慢,但可以实现在多个进程中各线程间进行同步。 二、关键代码段式工作在用户方式下,同步速度较快,但在使...
  • liyuanjinglyj
  • liyuanjinglyj
  • 2012-09-12 21:02
  • 1234

多线程编程(10) - 多线程同步之 Mutex (互斥对象)

原理分析: 互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行;  执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用. 其他线程可用 WaitFo...
  • xiao_xiaoli
  • xiao_xiaoli
  • 2012-11-25 15:14
  • 151

windows多线程系列002 利用互斥对象实现线程同步

接着上一篇文章我们继续讨论多线程的问题,这一次我们利用互斥对象(mutex)来解决火车站售票同步问题。 1 利用互斥对象实现线程同步 互斥对象(mutex)属于内核对象,它能够确保线程拥有对单个资源的...
  • DaveBobo
  • DaveBobo
  • 2016-04-11 20:56
  • 526
    《我们终将独自长大》

    有一天你将破蛹而出,成长得比人们期待的还要美丽,但这个过程会很痛,会很辛苦,有时候还会觉得灰心。面对着汹涌而来的现实觉得自己渺小无力。但这,也是生命的一部分。做好现在你能做的,然后,一切都会好的。我们都将孤独地长大,不要害怕。

    个人资料
    • 访问:380723次
    • 积分:6762
    • 等级:
    • 排名:第4039名
    • 原创:307篇
    • 转载:8篇
    • 译文:2篇
    • 评论:26条
    个人介绍
    博客专栏
    最新评论