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

问题描述

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

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

解决方案

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

解决方案二:

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

解决方案三:

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

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

解决方案四:

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

解决方案五:

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

解决方案六:

多线程互斥同步的问题
MFC多线程同步问题

时间: 2025-01-09 08:02:56

类-MFC多线程同步问题,互斥量的相关文章

UNIX环境高级编程:线程同步之互斥量

互斥量(也称为互斥锁)出自POSIX线程标准,可以用来同步同一进程中的各个线程.当然如果一个互斥量存放在多个进程共享的某个内存区中,那么还可以通过互斥量来进行进程间的同步. 互斥量,从字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用于保护临界区(共享资源),以保证在任何时刻只有一个线程能够访问共享的资源. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 1互斥量初始化和销毁 #include <pthread

1线程同步:互斥量,死锁

 1线程为什么要同步 A:共享资源,多个线程都可对共享资源操作. B:线程操作共享资源的先后顺序不确定. C:处理器对存储器的操作一般不是原子操作. 2互斥量 mutex操作原语 pthread_mutex_t pthread_mutex_init pthread_mutex_destroy pthread_mutex_lock pthread_mutex_trylock pthread_mutex_unlock 3临界区(Critical Section) 保证在某一时刻只有一个线程能访问

Linux多线程使用互斥量同步线程_Linux

本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两个信号量才能解决的只有子线程结束了对输入的处理和统计后,主线程才能继续执行的问题. 一.什么是互斥量 互斥量是另一种用于多线程中的同步访问方法,它允许程序锁住某个对象,使得每次只能有一个线程访问它.为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁. 二.互斥量的函数的使用 它们的定义与使用信号量的函数非常相似,它们的定义如下: #include <pthread.h> int pthre

Android多线程研究(3)线程同步和互斥及死锁

为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runnable{ private TestObj testObj = new TestObj(); public static void main(String[] args) { ThreadTest2 tt = new ThreadTest2(); Thread t1 = new Thread(tt,

MFC 多线程及线程同步

一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等.用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等.但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务. 在MFC中,一般用全局函数Afx

简单的多线程同步的小工具类

一些适用于Windows下的多线程同步的小工具类. 快速互斥锁,封装了临界区的Windows API: class FastMutex{private:    CRITICAL_SECTION    m_Cs;public:    FastMutex() { ::InitializeCriticalSection(&this->m_Cs); }    ~FastMutex() { ::DeleteCriticalSection(&this->m_Cs); }    void  

二、(LINUX 线程同步) 互斥量、条件变量以及生产者消费者问题

原创转载请注明出处: 接上一篇: 一.(LINUX 线程同步) 引入  http://blog.itpub.net/7728585/viewspace-2137980/ 在线程同步中我们经常会使用到mutex互斥量,其作用用于保护一块临界区,避免多线程并发操作对这片临界区带来的数据混乱, POSIX的互斥量是一种建议锁,因为如果不使用互斥量也可以访问共享数据,但是可能是不安全的. 其原语包含: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

同步-互斥量 临界区 信号量 条件变量 效率对比

问题描述 互斥量 临界区 信号量 条件变量 效率对比 windows 下,如下四种同步方式中,互斥量 临界区 信号量 条件变量, 效率对比,求指导,谢谢 解决方案 据我自己在windows下的测试,信号量比条件变量高效,大概是其6倍 解决方案二: 条件变量效率应该最高,但是可能不是那么线程安全 临界区效率第二好 解决方案三: 临界区(Critical Section)(同一个进程内,实现互斥) 保证在某一时刻只有一个线程能访问数据的简便办法.在任意时刻只允许一个线程对共享资源进行访问.如果有多个

关于MFC中ccmdtarget这个类在多线程中传递消息参数的用法

问题描述 关于MFC中ccmdtarget这个类在多线程中传递消息参数的用法 关于MFC中ccmdtarget这个类在多线程中传递消息参数的用法?看了一些资料,但是没有提到如何用它来调用多线程,具体怎么做呢? 解决方案 http://blog.csdn.net/hyhnoproblem/article/details/6117631