使用win32api的CriticalSectionhe CComCriticalSection有什么不同吗? 功能肯定一样对不? 实现上有什么不同吗? 有没有在EnterCriticalSection()/LeaveCriticalSection()之外做什么事情? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这也算问题啊 你自己看一下CComCriticalSection的实现代码 就那么几行只是为了方便而已 这个类 class CComCriticalSection{public: CComCriticalSection() throw() { memset(&m_sec, 0, sizeof(CRITICAL_SECTION)); } ~CComCriticalSection() { } HRESULT Lock() throw() { EnterCriticalSection(&m_sec); return S_OK; } HRESULT Unlock() throw() { LeaveCriticalSection(&m_sec); return S_OK; } HRESULT Init() throw() { HRESULT hRes = E_FAIL; __try { InitializeCriticalSection(&m_sec); hRes = S_OK; } // structured exception may be raised in low memory situations __except(STATUS_NO_MEMORY == GetExceptionCode()) { hRes = E_OUTOFMEMORY; } return hRes; } HRESULT Term() throw() { DeleteCriticalSection(&m_sec); return S_OK; } CRITICAL_SECTION m_sec;};以上是CComCriticalSection的代码。EnterCriticalSection()/LeaveCriticalSection()指临界区。如果一个线程调用了EnterCriticalSection(&m_sec);然后继续处理,在未调用LeaveCriticalSection(&m_sec)。这时另一个线程也调用了EnterCriticalSection(&m_sec);,这个时间由于第一个线程未调用LeaveCriticalSection(&m_sec),那么这个线程就会一直阻塞在EnterCriticalSection(&m_sec);不会往下走流程了,直到第一个线程调用LeaveCriticalSection(&m_sec)。这样,两个线程中EnterCriticalSection()/LeaveCriticalSection()之间的代码同一时间只能有一个线程进行处理,这对访问共享资源来说是很必要的。当然两个调用调用EnterCriticalSection()/LeaveCriticalSection()的时候,传递的参数m_sec要是同一个,不然不起作用。 VC如何用socket传送剪切板的文本或图片? SDI中TreeCtrl的问题 如何修改单文档程序菜单字体 关于CListCtrl的头部点击的问题 菜鸟问题!!关于画笔! 为什么每次编译都是全编译? socket 通讯时,如果指定的IP地址不存在connect将浪费很多时间,该如何解决? 请教#import的问题 有关CRecordSet 我是一个会员,谁能给我讲讲com/dcom,不胜感激 为何在对话框的picture control上画图显示不出来? 用MFC做的bmp图片浏览器 求助
只是为了方便而已 这个类
class CComCriticalSection
{
public:
CComCriticalSection() throw()
{
memset(&m_sec, 0, sizeof(CRITICAL_SECTION));
}
~CComCriticalSection()
{
}
HRESULT Lock() throw()
{
EnterCriticalSection(&m_sec);
return S_OK;
}
HRESULT Unlock() throw()
{
LeaveCriticalSection(&m_sec);
return S_OK;
}
HRESULT Init() throw()
{
HRESULT hRes = E_FAIL;
__try
{
InitializeCriticalSection(&m_sec);
hRes = S_OK;
}
// structured exception may be raised in low memory situations
__except(STATUS_NO_MEMORY == GetExceptionCode())
{
hRes = E_OUTOFMEMORY;
}
return hRes;
} HRESULT Term() throw()
{
DeleteCriticalSection(&m_sec);
return S_OK;
}
CRITICAL_SECTION m_sec;
};
以上是CComCriticalSection的代码。
EnterCriticalSection()/LeaveCriticalSection()指临界区。
如果一个线程调用了EnterCriticalSection(&m_sec);然后继续处理,在未调用LeaveCriticalSection(&m_sec)。
这时另一个线程也调用了EnterCriticalSection(&m_sec);,这个时间由于第一个线程未调用LeaveCriticalSection(&m_sec),那么这个线程就会一直阻塞在EnterCriticalSection(&m_sec);不会往下走流程了,直到第一个线程调用LeaveCriticalSection(&m_sec)。
这样,两个线程中EnterCriticalSection()/LeaveCriticalSection()之间的代码同一时间只能有一个线程进行处理,这对访问共享资源来说是很必要的。
当然两个调用调用EnterCriticalSection()/LeaveCriticalSection()的时候,传递的参数m_sec要是同一个,不然不起作用。