SKY外语计算机学习

标题: (试发贴) ATL中的自动临界段对象(ATL) [打印本页]

作者: wangbeacon    时间: 2012-6-10 22:26
标题: (试发贴) ATL中的自动临界段对象(ATL)
本帖最后由 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. }
复制代码



作者: admin    时间: 2012-6-11 01:14
好贴!




欢迎光临 SKY外语计算机学习 (http://skywj.com/) Powered by Discuz! X2.5