- 生肖
- 龙
- 星座
- 天秤座
- 性别
- 男
- 积分
- 146
- 积分
- 174
- 精华
- 2
- 阅读权限
- 20
- 注册时间
- 2012-6-10
- 最后登录
- 2019-6-18
- 帖子
- 8
- 生肖
- 龙
- 星座
- 天秤座
- 性别
- 男
|
本帖最后由 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;
- }
复制代码
|
|