İki iş parçacığı arasında iletişim kurmak için kuyruk kullanıyorum (yalnızca özel sınıf örneğini üreten ve işaretçiyi sırasına iter, diğer sıra, özel sınıftaki sıra işaretçisinden okunur ve bazı hesaplamalar yapar).Kuyruk atomuna nasıl itilir ve açılır, bu işlemler nasıl kilitlenir?
6
A
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.
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. –
@MikeSeymour - meh, kimin umurunda? Bir sıradan bir itme/pop gibi bir op basit bir istisna atarsanız, uygulama derin kahverengi şeylerde zaten :( –