到底用不用CSingleLock和CMultiLock ?

力为
领域专家: C/C++技术领域
2005-09-27 11:46:57
MSDN这样说的:
In order to use the synchronization classes CSemaphore, CMutex, CCriticalSection, and CEvent, you must create either a CSingleLock or CMultiLock object to wait on and release the synchronization object.

但又这样说的:
Alternatively, you can create a CSemaphore object stand-alone, and access it explicitly before attempting to access the controlled resource. This method, while clearer to someone reading your source code, is more prone to error.

前面说必须用CSingleLock 或 CMultiLock ,后面说可以不用。
但到底是用还是不用呢?
不用会容易发生什么错误呢?
...全文
186 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
力为 2005-10-13
  • 打赏
  • 举报
回复
再没有人讨论我就结帖了哦
DentistryDoctor 2005-09-27
  • 打赏
  • 举报
回复
比较一下:
//CCriticalSection m_csLock;

void Function()
{
CSingleLock lock(&m_csLock,TRUE);
...
}


void Function2()
{
m_csLock.Lock();
...
m_csLock.Unlock();
}

DentistryDoctor 2005-09-27
  • 打赏
  • 举报
回复
不是说必须用。
但CSingleLock/CMultiLock可以很方便的实现自旋锁。
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 );

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧