2012-07-27 17 views

cevap

8

Muhtemelen en taşınabilir olmayan C++ 11 kilitleme mekanizması, Boost.Thread kitaplığından synchronisztion türleridir. Özellikle mutex sınıfı, bir kaynağa özel erişim sağlamak için basit bir kilitlenebilir nesne sunar. Örneğin:

#include <boost/thread/mutex.hpp> 
#include <queue> 

template <typename T> 
class locking_queue { 
public: 
    void push(T const & value) { 
     boost::mutex::scoped_lock lock(mutex); 
     queue.push(value); 
    } 

    bool pop(T & value) { 
     boost::mutex::scoped_lock lock(mutex); 
     if (queue.empty()) { 
      return false; 
     } else { 
      value = queue.front(); 
      queue.pop(); 
      return true; 
     } 
    } 

private: 
    std::queue<T> queue; 
    boost::mutex mutex; 
}; 

diğer avantajı bu yerine o kullanmaya karar verirseniz dönüşüm oldukça basit hale getirecek C++ 11 std::mutex sınıfına çok benzer olmasıdır.

3

İşte sözde kodu (C++ 11 standardını kullanamazsınız) girişiminde bulunacağını ve nasıl bu işlemleri kilitlemek için atomik kuyrukta, üzerinde pop nasıl?

// Thread A 
mutex.lock(); 
q.push(); 
mutex.unlock(); 

// Thread B 
mutex.lock(); 
q.pop(); 
mutex.unlock(); 

Eğer boost kullanıyorsanız, mutex sınıfını deneyebilirsiniz.

+2

Her zaman bir RAII stili kapsamlı kilit kullanmanız gerekir, ancak "push" veya "pop" bir istisna atarsa, mutex hiçbir zaman için kilitli kalmaz. –

+0

@MikeSeymour - meh, kimin umurunda? Bir sıradan bir itme/pop gibi bir op basit bir istisna atarsanız, uygulama derin kahverengi şeylerde zaten :( –

İlgili konular