设为首页收藏本站

SKY外语、计算机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4910|回复: 1
打印 上一主题 下一主题

[C] (试发贴) ATL中的自动临界段对象(ATL)

[复制链接]

7

主题

0

好友

174

积分

注册会员

Rank: 2

生肖
星座
天秤座
性别
跳转到指定楼层
楼主
发表于 2012-6-10 22:26:50 |只看该作者 |倒序浏览
本帖最后由 sky_yx 于 2015-12-30 14:18 编辑

在我们编程的时候,多线程常用临界段去同步,锁.
但是如果在进入临界段的时候,忘记了退出临界段,或者产生了异常
直接跳出了,那就永远不会被解锁了,就会造成死锁,
自动临界段锁解决这个问题   ==,
  ATL中所有的自动临界段锁对象,  最简单的使用总结...
  1. #include <tchar.h>
  2. #include <atlbase.h>
  3. #include <atlmem.h>
  4. VOID Test()
  5. {   
  6.     //不自动调用创建和删除
  7.     {
  8.         CComCriticalSection _ccs;
  9.         _ccs.Init();            // Create;
  10.         _ccs.Lock();            // Lock;
  11.         _ccs.Unlock();          // Unlock;
  12.         _ccs.Term();            // Delete(Must Call);
  13.     }
  14.    
  15.     //自动调用创建和删除
  16.     {
  17.         CComAutoCriticalSection _cacs;  // Construct, Create;
  18.         _cacs.Lock();                   // Lock;
  19.         _cacs.Unlock();                 // Unlock;
  20.     }                                   //Deconstruct, Delete;
  21.    
  22.     //手动创建, 如果没有手动调用删除,则自动调用删除
  23.     {
  24.         CComSafeDeleteCriticalSection _csdcs;
  25.         _csdcs.Init();                  // Create
  26.         _csdcs.Lock();                  // Lock
  27.         _csdcs.Unlock();                // Unlock
  28.         _csdcs.Term();                  // Manaul Delete;
  29.     }                                   // Deconstruct, Delete(is has no Manaul Delete);
  30.    
  31.     //手动创建, 自动删除
  32.     {
  33.         CComAutoDeleteCriticalSection _cadcs;
  34.         _cadcs.Init();                  // Create
  35.         _cadcs.Lock();                  // Lock
  36.         _cadcs.Unlock();                // Unlock
  37.     }                                   // Deconstruct, Delete;
  38.     //所有操作直接返回 S_OK
  39.     {
  40.         // All do nothing
  41.         CComFakeCriticalSection _cfcs;
  42.         _cfcs.Init();
  43.         _cfcs.Lock();
  44.         _cfcs.Unlock();
  45.         _cfcs.Term();
  46.     }
  47.    
  48.     {
  49.         CComAutoCriticalSection _cs;
  50.         {
  51.             CCritSecLock _al( _cs.m_sec, TRUE );    // 参数二:是否立即加锁
  52.             //_al.Lock();         // 加锁(不能锁两次)
  53.             //_al.Unlock();       // 解锁(不能解锁两次)
  54.         }//自动对 _cs 调用解锁
  55.     }
  56. }
  57. int _tmain(int argc, _TCHAR* argv[])
  58. {
  59.     Test();
  60.     getchar();
  61.     return 0;
  62. }
复制代码


分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享淘帖0 收藏收藏0 评分评分
+q67824885

200

主题

3

好友

2253

积分

管理员

Rank: 9Rank: 9Rank: 9

性别
保密

热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老 最佳新人 活跃会员

沙发
发表于 2012-6-11 01:14:42 |只看该作者
好贴!
回复

使用道具 评分 举报

您需要登录后才可以回帖 登录 | 立即注册


手机版|SKY外语计算机学习 ( 粤ICP备12031577 )    

GMT+8, 2024-5-4 04:39 , Processed in 0.130760 second(s), 26 queries .

回顶部