windows中用什么对象使多线程调用同一个对象之间对资源互斥访问

windows中用什么对象使多线程之间对资源互斥访问_百度知道
windows中用什么对象使多线程之间对资源互斥访问
我有更好的答案
进程线程同步四种用式: 1、 临界区(CCriticalSection) 线程访问独占性共享资源使用临界区象拥临界区线程访问保护起资源或代码段其线程若想访问则挂起直拥临界区线程放弃临界区
采纳率:65%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。用C++实现多线程Mutex锁(Win32)_Linux编程_Linux公社-Linux系统门户网站
你好,游客
用C++实现多线程Mutex锁(Win32)
来源:Linux社区&
作者:shenghuiping2001
本文目的:用C++和Windows的互斥对象(Mutex)来实现线程同步锁。
准备知识:1,内核对象互斥体(Mutex)的工作机理,WaitForSingleObject函数的用法,这些可以从MSDN获取详情; 2,当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex 是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。
下边是我参考开源项目C++ Sockets的代码,写的线程锁类Lock.h
#ifndef&_Lock_H &&
#define&_Lock_H &&
#include&&windows.h& &&
class&IMyLock&&
&&&&virtual&~IMyLock()&{}&&
&&&&virtual&void&Lock()&const&=&0;&&
&&&&virtual&void&Unlock()&const&=&0;&&
class&Mutex&:&public&IMyLock&&
&&&&Mutex();&&
&&&&~Mutex();&&
&&&&virtual&void&Lock()&const;&&
&&&&virtual&void&Unlock()&const;&&
private:&&
&&&&HANDLE&m_&&
class&CLock&&
&&&&CLock(const&IMyLock&);&&
&&&&~CLock();&&
private:&&
&&&&const&IMyLock&&m_&&
#include&"Lock.h" &&
Mutex::Mutex()&&
&&&&m_mutex&=&::CreateMutex(NULL,&FALSE,&NULL);&&
Mutex::~Mutex()&&
&&&&::CloseHandle(m_mutex);&&
void&Mutex::Lock()&const&&
&&&&DWORD&d&=&WaitForSingleObject(m_mutex,&INFINITE);&&
void&Mutex::Unlock()&const&&
&&&&::ReleaseMutex(m_mutex);&&
CLock::CLock(const&IMyLock&&m)&:&m_lock(m)&&
&&&&m_lock.Lock();&&
CLock::~CLock()&&
&&&&m_lock.Unlock();&&
下边是测试代码
#include&&iostream& &&
#include&&process.h& &&
#include&"Lock.h" &&
using&namespace&&&
Mutex&g_L&&
unsigned&int&__stdcall&StartThread(void&*pParam)&&
&&&&char&*pMsg&=&(char&*)pP&&
&&&&if&(!pMsg)&&
&&&&&&&&return&(unsigned&int)1;&&
&&&&CLock&lock(g_Lock);&&
&&&&for(&int&i&=&0;&i&&&5;&i++&)&&
&&&&&&&&cout&&&&pMsg&&&&&&
&&&&&&&&Sleep(&500&);&&
&&&&return&(unsigned&int)0;&&
int&main(int&argc,&char*&argv[])&&
&&&&HANDLE&hThread1,&hThread2;&&
&&&&unsigned&int&uiThreadId1,&uiThreadId2;&&
&&&&char&*pMsg1&=&"First&print&thread.";&&
&&&&char&*pMsg2&=&"Second&print&thread.";&&
&&&&hThread1&=&(HANDLE)_beginthreadex(NULL,&0,&&StartThread,&(void&*)pMsg1,&0,&&uiThreadId1);&&
&&&&hThread2&=&(HANDLE)_beginthreadex(NULL,&0,&&StartThread,&(void&*)pMsg2,&0,&&uiThreadId2);&&
&&&&DWORD&dwRet&=&WaitForSingleObject(hThread1,INFINITE);&&
&&&&if&(&dwRet&==&WAIT_TIMEOUT&)&&
&&&&&&&&TerminateThread(hThread1,0);&&
&&&&dwRet&=&WaitForSingleObject(hThread2,INFINITE);&&
&&&&if&(&dwRet&==&WAIT_TIMEOUT&)&&
&&&&&&&&TerminateThread(hThread2,0);&&
&&&&::CloseHandle(hThread1);&&
&&&&::CloseHandle(hThread2);&&
&&&&system("pause");&&
&&&&return&0;&&
用VC2005编译,启动程序,下边是截图
如果将测线程函数中的代码注视掉,重新编译代码,运行
CLock&lock(g_Lock);&&
则结果见下图
&&& 由此可见,通过使用Mutex的封装类,即可达到多线程同步的目的。因Mutex属于内核对象,所以在进行多线程同步时速度会比较慢,但是用互斥对象可以在不同进程的多个线程之间进行同步。
在实际应用中,我们通常还会用到临界区,也有叫做关键代码段的CRITICAL_SECTION,在下篇中,我将会把CRITICAL_SECTION锁添加进来,并且对Mutex和CRITICAL_SECTION的性能做以比较。
相关资讯 & & &
& (05/23/:27)
& (05/10/:27)
& (03月12日)
& (05/22/:16)
& (04/28/:45)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)线程间的通信、同步方式与进程间通信方式 - 简书
线程间的通信、同步方式与进程间通信方式
1、线程间的通信方式
使用全局变量
主要由于多个线程可能更改全局变量,因此全局变量最好声明为
使用消息实现通信
在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信sendMessage,postMessage。
1)定义消息#define WM_THREAD_SENDMSG=WM_USER+20;
2)添加消息函数声明afx_msg int OnTSendmsg();
3)添加消息映射ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM)
4)添加OnTSM()的实现函数;
5)在线程函数中添加PostMessage消息Post函数
使用事件CEvent类实现线程间通信
Event对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。
1)创建一个CEvent类的对象:CEvent threadS它默认处在未通信状态;
2)threadStart.SetEvent();使其处于通信状态;
3)调用WaitForSingleObject()来监视CEvent对象
2、线程间的同步方式
各个线程可以访问进程中的公共变量,资源,所以使用多线程的过程中需要注意的问题是如何防止两个或两个以上的线程同时访问同一个数据,以免破坏数据的完整性。数据之间的相互制约包括
1、直接制约关系,即一个线程的处理结果,为另一个线程的输入,因此线程之间直接制约着,这种关系可以称之为同步关系
2、间接制约关系,即两个线程需要访问同一资源,该资源在同一时刻只能被一个线程访问,这种关系称之为线程间对资源的互斥访问,某种意义上说互斥是一种制约关系更小的同步
线程间的同步方式有四种
临界区对应着一个CcriticalSection对象,当线程需要访问保护数据时,调用EnterCriticalSection函数;当对保护数据的操作完成之后,调用LeaveCriticalSection函数释放对临界区对象的拥有权,以使另一个线程可以夺取临界区对象并访问受保护的数据。
互斥与临界区很相似,但是使用时相对复杂一些(互斥量为内核对象),不仅可以在同一应用程序的线程间实现同步,还可以在不同的进程间实现同步,从而实现资源的安全共享。
信号量的用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源,PV操作
事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。由SetEvent()来触发,由ResetEvent()来设成未触发。
3、进程间通信方式
进程间通信又称IPC(Inter-Process Communication),指多个进程之间相互通信,交换信息的方法。根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型:
1、低级通信,控制信息的通信(主要用于进程之间的同步,互斥,终止和挂起等等控制信息的传递)
2、高级通信,大批数据信息的通信(主要用于进程间数据块数据的交换和共享,常见的高级通信有管道,消息队列,共享内存等).
:管道是一种,数据只能单向流动,而且。进程的亲缘关系通常是指父子进程关系。
: 有名管道也是半双工的通信方式,但是它。
: 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
: 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列。
: 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
[共享内存( shared memory )] :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是,它是针对其他进程间通信方式运行效率低而专门设计的。。
: 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
4、好文推荐(reference)
生活有规律真好
大纲 操作系统进程间通信 进程的通信机制主要有:管道、有名管道、消息队列、信号量、共享空间、信号、套接字。 操作系统线程间通信 线程同步机制是重点 linux中进程间通信和线程间通信的区别 进程/线程间同步机制 临界区(Critical Section)、互斥量(Mutex...
转载:http://www.jianshu.com/p/9 1、线程间的通信方式 使用全局变量主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile。 使用消息队列实现通信在Windows程序设计中,每一个线程都可以拥有自己的消息队列...
为自己学习方便,复制大神的学习性文章放在自己简书里,仅作为自己学习方便使用,如果作者疑此行为侵权,请随时联系本人删除,如有共同学习者复制此文章,请注明原出处(文章来源:http://blog.chinaunix.net/uid--id-4131123.htm...
为自己学习方便,复制大神的学习性文章放在自己简书里,仅作为自己学习方便使用,如果作者疑此行为侵权,请随时联系本人删除,如有共同学习者复制此文章,请注明原出处(文章来源:http://blog.chinaunix.net/uid--id-4131123...
文/tangsl(简书作者) 原文链接:http://www.jianshu.com/p/2b993a4b913e 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个...
茫茫的荒原上 一棵孤独的大树 突兀于天地之间 它光秃的枝杈上 端卧着一个鸟巢 在风中沉默着 冬天的清冷 凛冽地穿过它的身躯 悲怆如凄冷的清月 瞬间蚀骨般浸入 火车飞驰时 窗外的一幕 定格在 久远而又深刻的记忆里 从此后 无论何时看到鸟巢 清冽的悲悯 总是第一时间光临
应用内购In-App Purchase continues to be a terrific mechanism for selling products, services and subscriptions directly from your app. Get all...
今天老师通知我们同学,明天要请家长去学校听课!老师说要我们家长好好看看我们怎么上课。我们上课的表现要给家长们看看。我们一年一班所有人都得表现好好哒!这样家长们才知道我们是不是调皮的孩子。还是聪明的孩子。我们一年一般要做出好榜样。这样我们才可以给家长们汇报出一个好榜样。今天老...
在家上学的成都10岁男孩 10岁的成都男孩瑞瑞,在家里上学,每天练琴4个小时,德语和英语流利。他还是一个在线音频平台上的主播,用德语讲述儿童绘本故事,创作了一万多字的英文冒险小说,正在洽谈出版。为了尽快完成第二本英文小说,最近半个月,他每天写作超过4个小时。 上月底,瑞瑞成...
p2p机构_华融道理财 p2p机构_华融道理财 p2p机构_华融道理财

我要回帖

更多关于 java 多线程new对象 的文章

 

随机推荐