多线程编程:何时使用同步类

本文介绍MFC提供的六种多线程类,包括同步对象(如CSyncObject、CSemaphore等)和同步访问对象(CMultiLock、CSingleLock)。详细解释了何时使用哪种同步类来控制资源访问,确保资源的完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MFC 提供的六种多线程类分为两类:同步对象(CSyncObject、CSemaphore、CMutex、CCriticalSection 和 CEvent)和同步访问对象(CMultiLock 和 CSingleLock)。

当必须控制对资源的访问以确保资源的完整性时,使用同步类。同步访问类用于获取对这些资源的访问权。此文章描述各个类的使用时间。

若要确定应使用的同步类,请询问以下一系列问题:

  1. 应用程序必须等到发生某事才能访问资源(例如,在将数据写入文件之前,必须先从通信端口接收它)吗?

    如果是,则使用 CEvent

  2. 同一应用程序内一个以上的线程可以同时访问此资源(例如,应用程序允许在同一文档上最多同时打开五个带有视图的窗口)吗?

    如果是,请使用 CSemaphore

  3. 可以有一个以上的应用程序使用此资源(例如,资源在 DLL 中)吗?

    如果是,请使用 CMutex

    如果不是,请使用 CCriticalSection

从不直接使用 CSyncObject。它是其他四个同步类的基类。

MFC提供了一组同步和同步访问来解决线程同步问题。其中, 同步对象包括:CSyncObject、CSemaphore、CMutex,CCriticalSection和CEvent; 同步访问对象包括:CMultiLock和CSingleLock。同步类用于访问资源时保证资源的整体性。其中CSyncObject是其他四个同步类的基,不直接使用。信号同步类CSemaphore通常用于当一个应用程序中同时有多个线程访问一个资源的情况(例如,应用程序允许对同一个Document有多个View);事件同步类CEvent通常用于在应用程序访问资源之前应用程序必须等待的情况(比如,在数据写进一个文件之前数据必须从通信端口得到);互斥同步类CMutex和临界区同步类CCriticalSection都是用于保证一个资源一次只能有一个线程访问,二者的不同之处在于前者允许有多个应用程序使用该资源,例如,该资源在一个DLL当中,而后者则不允许对同一个资源的访问超出进程的范畴,而且使用临界区的方式效率比较高。同步访问用于获得对这些控制资源的访问。CMultiLock和CSingleLock的区别仅在于是需要控制访问多个还是单个资源对象。 信号量对象的构造函数: CSemaphore( LONG lInitialCount = 1, LONG lMaxCount = 1, LPCTSTR pstrName = NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL ); 单锁的构造函数: explicit CSingleLock( CSyncObject* pObject, BOOL bInitialLock = FALSE ); 多锁的构造函数: CMultiLock( CSyncObject* ppObjects[ ], DWORD dwCount, BOOL bInitialLock = FALSE );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值