SKY外语计算机学习
标题:
(试发贴) ATL中的自动临界段对象(ATL)
[打印本页]
作者:
wangbeacon
时间:
2012-6-10 22:26
标题:
(试发贴) ATL中的自动临界段对象(ATL)
本帖最后由 sky_yx 于 2015-12-30 14:18 编辑
在我们编程的时候,多线程常用临界段去同步,锁.
但是如果在进入临界段的时候,忘记了退出临界段,或者产生了异常
直接跳出了,那就永远不会被解锁了,就会造成死锁,
自动临界段锁解决这个问题 ==,
ATL中所有的自动临界段锁对象, 最简单的使用总结...
#include <tchar.h>
#include <atlbase.h>
#include <atlmem.h>
VOID Test()
{
//不自动调用创建和删除
{
CComCriticalSection _ccs;
_ccs.Init(); // Create;
_ccs.Lock(); // Lock;
_ccs.Unlock(); // Unlock;
_ccs.Term(); // Delete(Must Call);
}
//自动调用创建和删除
{
CComAutoCriticalSection _cacs; // Construct, Create;
_cacs.Lock(); // Lock;
_cacs.Unlock(); // Unlock;
} //Deconstruct, Delete;
//手动创建, 如果没有手动调用删除,则自动调用删除
{
CComSafeDeleteCriticalSection _csdcs;
_csdcs.Init(); // Create
_csdcs.Lock(); // Lock
_csdcs.Unlock(); // Unlock
_csdcs.Term(); // Manaul Delete;
} // Deconstruct, Delete(is has no Manaul Delete);
//手动创建, 自动删除
{
CComAutoDeleteCriticalSection _cadcs;
_cadcs.Init(); // Create
_cadcs.Lock(); // Lock
_cadcs.Unlock(); // Unlock
} // Deconstruct, Delete;
//所有操作直接返回 S_OK
{
// All do nothing
CComFakeCriticalSection _cfcs;
_cfcs.Init();
_cfcs.Lock();
_cfcs.Unlock();
_cfcs.Term();
}
{
CComAutoCriticalSection _cs;
{
CCritSecLock _al( _cs.m_sec, TRUE ); // 参数二:是否立即加锁
//_al.Lock(); // 加锁(不能锁两次)
//_al.Unlock(); // 解锁(不能解锁两次)
}//自动对 _cs 调用解锁
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Test();
getchar();
return 0;
}
复制代码
作者:
admin
时间:
2012-6-11 01:14
好贴!
欢迎光临 SKY外语计算机学习 (http://skywj.com/)
Powered by Discuz! X2.5