İ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.
İlgili konular
- 1. Firebase: İşlemde nasıl itilir?
- 2. Procfile Heroku'ya nasıl itilir?
- 3. Taslaklar Gerrit'e nasıl itilir?
- 4. Nasıl gmail atomuna Python ile giriş yapmalı?
- 5. TVirtualStringTree'de seçili düğümler nasıl kilitlenir?
- 6. Kullanıcılar Devise'yi kullanarak nasıl kilitlenir?
- 7. Ayrılmamış kullanıcılardan bellek nasıl kilitlenir?
- 8. Php'de mysql tabloları nasıl kilitlenir
- 9. Bu .DB dosyası nasıl açılır?
- 10. Bu kuyruk neden yinelenmiyor?
- 11. iki kafa oluşturur, nasıl itilir?
- 12. Kuyruk & Yığınımı nasıl görüntülerim?
- 13. Temp dosyaları oluşturmadan dosya nasıl kilitlenir?
- 14. intelliJ ile proje yerel git deposuna nasıl itilir?
- 15. Vektörlerin bir vektöründe nasıl geri itilir?
- 16. Json Nesnesine Json Nesnesine Nasıl İtilir?
- 17. Storyboard'lar olmadan Yeni Görünüm Nasıl İtilir Swift
- 18. BitBucket ve GitHub için özel SSH anahtarı nasıl kullanılır/itilir?
- 19. Tüm asenkron işlemler nasıl beklenir?
- 20. Aşağı açılır oklar nasıl açılır
- 21. RabbitMQ kuyruk tasarım ve ölçekleme
- 22. Açılır pencere nasıl açılır, Javascript
- 23. Bu Prolog'da kuyruk özlemi yapılabilir mi?
- 24. ben bu açılır liste
- 25. git - boş klasör nasıl kaldırılır ve bu değişikliği nasıl değiştirirsiniz?
- 26. Koleksiyonlardaki bu yaygın işlemler neden Julia'da yeniden adlandırıldı?
- 27. Process.join() ve kuyruk çok sayıda
- 28. İşlemler için childCategory bilgilerine nasıl erişilir?
- 29. TFS raporları nasıl açılır ve düzenlenir?
- 30. Artefakt ve filtre kaynaklarını nasıl açılır?
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 :( –