2011-11-02 4 views
10

私はboostまたは最新のstd :: threadライブラリを使用できません。行く方法はスコープ付きのmutexのカスタム実装を作成することです。スコープ付きmutexロック用のカスタムRAII C++実装

クラスインスタンスが作成されている場合は、しばらくするとmutexがロックされます。クラスが破壊されると、mutexはロック解除されます。

実装はありますか?私は車輪を再発明したくない。

私はpthreadsを使用する必要があります。

  • 資源獲得は初期化==「RAII」

答えて

13

ですこれは、古い答えです。

  • std::lock_guard
  • std::mutex

    とstd :: unique_lockのような他のオプションは、後押し:: unique_lockの

    :C++ 11は、独立したより多くのプラットフォームをしているより良いヘルパーが含まれています
  • RAIIのチュートリアルで行います。

    ここでは要点です:もちろん(もhttp://ideone.com/kkB86上)

    // stub mutex_t: implement this for your operating system 
    struct mutex_t 
    { 
        void Acquire() {} 
        void Release() {} 
    }; 
    
    struct LockGuard 
    { 
        LockGuard(mutex_t& mutex) : _ref(mutex) 
        { 
         _ref.Acquire(); // TODO operating system specific 
        }; 
    
        ~LockGuard() 
        { 
          _ref.Release(); // TODO operating system specific 
        } 
        private: 
        LockGuard(const LockGuard&); // or use c++0x ` = delete` 
    
        mutex_t& _ref; 
    }; 
    
    int main() 
    { 
        mutex_t mtx; 
    
        { 
         LockGuard lock(mtx); 
         // LockGuard copy(lock); // ERROR: constructor private 
         // lock = LockGuard(mtx);// ERROR: no default assignment operator 
        } 
    
    } 
    

    あなたはmutex_tに向けた、それは一般的なことができます、あなたはサブクラス化を防ぐことができます。私はpthreadsを要求するために私の質問を更新し

    struct mutex_t 
    { 
        public: 
         mutex_t(pthread_mutex_t &lock) : m_mutex(lock) {} 
    
         void Acquire() { pthread_mutex_lock(&m_mutex); } 
         void Release() { pthread_mutex_unlock(&m_mutex); } 
        private: 
         pthread_mutex_t& m_mutex; 
    }; 
    
    +0

    : コピー/割り当ては、すでにpthreadsのためにあるため、参照フィールドの

    EDITを禁止されています。あなたの_ref.Acquire()はpthread_mutex_lock(_ref)になりますか? – cateof

    +1

    Mmm。あなたのスレッドライブラリに実装する部分には、そのようにマークされていました。とにかく、pthread_mutex_tのクイック実装を参考に追加しました。 – sehe

    +0

    あなたはOSの詳細を指定する前にあなたの答えがありました:-) – cateof

    関連する問題