[转帖] C++中实现静态初始化代码段

作者在 2008-09-30 23:12:01 发布以下内容

C++中,我们经常会用到静态变量,但对于这些静态变量的初始化,我们只能对其进行赋初值,不能像C#或是Java中那样,有一个静态初始化段来进行一些复杂的初始化工作。

举例来说,我有一个类,其成员变量会在多个线程中并发访问,所以我需要一个锁来保护数据一致性。于是有了这样的代码:

  1. class MyClass
  2. {
  3. public:
  4.     void Foo()
  5.     {
  6.         ::EnterCriticalSection(&ms_lock);
  7.         // operates m_mapValues
  8.         ::LeaveCriticalSection(&ms_lock);
  9.     }
  10. protected:
  11.     std::map<int,std::string> m_mapValues;
  12.     static CRITICAL_SECTION ms_lock;
  13. };
  14. CRITICAL_SECTION MyClass::ms_lock;    // We can't call InitializeCriticalSection here

前几天从同事那里学到了一个技巧,只用很少的几行代码,就可以实现这个功能。感叹自己C++还没用精,东西其实都知道,就是在问题面前没能想到。

解决上面问题的办法:

  1. class CCriticalSection
  2. {
  3. public:
  4.     CCriticalSection()  { ::InitializeCriticalSection(&m_criticalSection); }
  5.     ~CCriticalSection() { ::DeleteCriticalSection(&m_criticalSection); }
  6.     void Lock()   { ::EnterCriticalSection(&m_criticalSection); }
  7.     void Unlock() { ::LeaveCriticalSection(&m_criticalSection); }
  8. protected:
  9.         CRITICAL_SECTION m_criticalSection;
  10. };
  11. template <class LockObject>
  12. class ScopedLocker
  13. {
  14. public:
  15.     ScopedLocker(LockObject& lockObject) : m_lockObject(lockObject) { m_lockObject.Lock(); }
  16.     ~ScopedLocker() { m_lockObject.Unlock(); }
  17. protected:
  18.     LockObject& m_lockObject;
  19. };
  20. class MyClass
  21. {
  22. public:
  23.     void Foo()
  24.     {
  25.         ScopedLocker<CCriticalSection> locker(m_lockObject); // EnterCriticalSection will be called here
  26.         // operates m_mapValues;
  27.     } // LeaveCriticalSection will be called here
  28. protected:
  29.     std::map<int, std::string> m_mapValues;
  30.     static CCriticalSection m_lockObject;
  31. };
  32. CCriticalSection MyClass::m_lockObject;    // InitializeCriticalSection will be called here

 

技术分享 | 阅读 2344 次
文章评论,共2条
blueboy82006(作者)
2008-09-30 23:12
1
来自CSDN...
vfdff
2008-10-02 11:06
2
两段代码什么区别?
游客请输入验证码