问题描述
- MFC多线程同步问题,互斥量
-
共享资源是一些类对象的MAP,每个对象(某设备实例)中有不同的互斥量同步不同的类变量(本意是防止多线程访问同一个对象),现在迷糊了,互斥量放在类里面是不是不当?是不是在访问对象的时候就加互斥量来的方便(对整个对象进行加锁 - 因为对整个类操作较多,这么做貌似锁太深了)?求大神帮助
解决方案
这个要具体看对象的生存空间,和互斥量的作用!无法一概而论。
解决方案二:
搞这么麻烦干什么,线程同步直接用CreateMutex和WaitForSingleObject好了。
多个线程访问同一个资源时,只有一个线程可以获取互斥体,其他线程会进入“阻塞”状态,当拥有互斥体的线程释放互斥体时,系统的任务调度程序会让一个阻塞的线程获取互斥体并使之恢复运行。
另外线程同步还可以用事件对象,自旋锁,信号灯。
自旋锁是比较特殊的,在等待时,线程不进入“阻塞”状态,而是不停的自旋,不停检查自旋锁有没有被释放,这样要比其他的方法唤醒速度快更精准,但是会占用宝贵的CPU时间,微软认为如果使用自旋锁同步时间过长(我记得是2纳秒)的程序是不友好的程序
解决方案三:
互斥量的操作,控制应该是针对动作,而不是对象,也就是你说的访问共享对象时,才添加到这些访问函数,这样才能做到对共享对象资源的保护。
不过有时候可能不需要粒度那么深,就可以用一些比较大的锁,这样简单,当然性能会有一些损失。
解决方案四:
也可以用EnterCriticalSection,有一种用法开始是用户态 用自旋锁, 一段时间得不到资源才进入内核态
解决方案五:
在线程中访问对象的MAP的地址,加锁就可以了,不用创建互斥内核对象
解决方案六:
多线程互斥同步的问题
MFC多线程同步问题
时间: 2025-01-09 08:02:56