2 q   wert  yuiop q___wert__yuiop 于 2015.07.11 16:50 提问

MFC多线程同步问题,互斥量

共享资源是一些类对象的MAP,每个对象(某设备实例)中有不同的互斥量同步不同的类变量(本意是防止多线程访问同一个对象),现在迷糊了,互斥量放在类里面是不是不当?是不是在访问对象的时候就加互斥量来的方便(对整个对象进行加锁 - 因为对整个类操作较多,这么做貌似锁太深了)?求大神帮助

6个回答

91program
91program   Ds   Rxr 2015.07.11 18:58

这个要具体看对象的生存空间,和互斥量的作用!无法一概而论。

q___wert__yuiop
q___wert__yuiop 对象是随进程一直存在(只要被创建),大概有1W多个对象,对象中存不同的变量供线程访问
2 年多之前 回复
zuishikonghuan
zuishikonghuan   2015.07.11 19:01

搞这么麻烦干什么,线程同步直接用CreateMutex和WaitForSingleObject好了。
多个线程访问同一个资源时,只有一个线程可以获取互斥体,其他线程会进入“阻塞”状态,当拥有互斥体的线程释放互斥体时,系统的任务调度程序会让一个阻塞的线程获取互斥体并使之恢复运行。
另外线程同步还可以用事件对象,自旋锁,信号灯。
自旋锁是比较特殊的,在等待时,线程不进入“阻塞”状态,而是不停的自旋,不停检查自旋锁有没有被释放,这样要比其他的方法唤醒速度快更精准,但是会占用宝贵的CPU时间,微软认为如果使用自旋锁同步时间过长(我记得是2纳秒)的程序是不友好的程序

zuishikonghuan
zuishikonghuan 回复q___wert__yuiop: 是的,其他线程都被挂起不再占用CPU,在互斥体释放之后系统会使等待的线程得到互斥体恢复运行
2 年多之前 回复
q___wert__yuiop
q___wert__yuiop 互斥量用的太深,互斥量怎么加都成问题,是MAP就用一个互斥量?有一个线程占用,其他的都只能挂着
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.07.11 21:32

互斥量的操作,控制应该是针对动作,而不是对象,也就是你说的访问共享对象时,才添加到这些访问函数,这样才能做到对共享对象资源的保护。

不过有时候可能不需要粒度那么深,就可以用一些比较大的锁,这样简单,当然性能会有一些损失。

oyljerry
oyljerry 回复q___wert__yuiop: 嗯,确实太多了,你应该分组一下,把一些公用一个互斥量
2 年多之前 回复
q___wert__yuiop
q___wert__yuiop 对象中保存了设备的一些值,不同的操作用不同的互斥量,会不会太多?对象大概有1w个,每个对象有5个互斥量
2 年多之前 回复
leisurehuangzhong
leisurehuangzhong   2015.07.11 22:02

也可以用EnterCriticalSection,有一种用法开始是用户态 用自旋锁, 一段时间得不到资源才进入内核态

leisurehuangzhong
leisurehuangzhong 如果正在拥有资源的线程很长时间不释放,等待的线程也会被挂起,如果很快释放的话,那么在等待的线程,假设还没被挂起,要比用内核做互斥更快得到资源,感觉效率更高呀。
2 年多之前 回复
q___wert__yuiop
q___wert__yuiop 这样线程不会挂起,其他的线程调度不上,不影响性能吗?
2 年多之前 回复
lx624909677
lx624909677   Ds   Rxr 2015.07.12 10:32

在线程中访问对象的MAP的地址,加锁就可以了,不用创建互斥内核对象

lx624909677
lx624909677 回复q___wert__yuiop: 准确来说,是切换内核对象时会比较耗资源,不是创建的时候,上面说错了
2 年多之前 回复
lx624909677
lx624909677 回复q___wert__yuiop: 创建类似event互斥互相时候确实会比较耗资源,加锁只需要在访问共同操作对象的地方加锁就可以了,做其他地方的操作可以不加
2 年多之前 回复
q___wert__yuiop
q___wert__yuiop 这么说是互斥内核对象比锁耗资源吗?锁加在对象身上的话加得太深了,对象就是设备,有很多其他操作
2 年多之前 回复
CSDNXIAOD
CSDNXIAOD   2015.07.16 15:23

多线程互斥同步的问题
MFC多线程同步问题
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片