Birden çok konudan std :: map okuyabilmeyi ve yazabilmeyi istiyorum. Muteks olmadan bunu yapmanın bir yolu var mı (belki std :: atomic ile)?std :: harita Birden çok konudan okuma/okuma
Değilse, bunu C++ 11'de yapmanın en kolay yolu nedir?
Birden çok konudan std :: map okuyabilmeyi ve yazabilmeyi istiyorum. Muteks olmadan bunu yapmanın bir yolu var mı (belki std :: atomic ile)?std :: harita Birden çok konudan okuma/okuma
Değilse, bunu C++ 11'de yapmanın en kolay yolu nedir?
değerleristd::atomic<>
ise, değiştirmek ve keyfi ipliklerden onları okumak, ama her nasılsa onların adreslerini kaydetmiş gerekir edebilir - işaretçileri, referanslar veya yineleyiciler - ve hiç bilmek gerekir diğer iş parçacığı üzerinde erase
arayabilirler ....
Yine de, atomik değerler bile, kapsayıcıyı değiştirmeyi (örneğin, öğeleri ekleme veya silme) güvenli hale getirmeyecek, diğer iş parçacıkları da değişiklik veya arama veya yineleme yapıyor. size()
, empty()
, begin()
, end()
, count()
ve yineleyici hareketi gibi "const
" işlevleri bile güvensizdir, çünkü mutasyon işlemleri, düğümler arası bağlantıların yeniden döşenmesi veya aynı verilerin güncellenmesinin ortasında olabilir.
Yukarıdakilerden başka bir şey için, bir muteks'e gereksinim duyarsınız. Somut bir örnek için
std::string
anahtar
"client_counter"
- diğer konu
find
varken yine bu parçaya bir yineleyici alır ve tezgaha atom güncellemeler yapan bir iş parçacığı başlayabileceğini Öğe ve ondan okuyun ama
erase
olmamalıdır.
map
'a eklenmiş diğer düğümler, diğer güncelleyici ve okuyucularla,
client_counter
-çubuk iş parçacığı ile herhangi bir ek eşitleme olmadan eklenebilir.
kısıtlamalarına iyi bir yanıt verdiniz. Bir std :: map eşzamanlı olarak kullanmak için bir _reader-yazıcısı lock_'a ihtiyacınız olacak. – Gerard
@Gerard: "çok gerçekten" cevabımın kullanışlı bir özetini sunduğunuz gibi geliyor, ama yorumunuz atomik değerleri değerlere göre reddediyor ve yeni bir konu sunuyor - okuyucu-yazar kilitleri her zaman mütevazi muteks için tercih edilir.Değerlere atomik erişim * çok * kısıtlayıcı olsa da, OP ve diğer okuyuculara, kendi senaryolarında yardımcı programı belirlemek için ve kilitli olmayan senkronizasyon mekanizmasının tam olarak kullanılmasına karar vermek için bırakacağım ... bu başka bir soru. Şerefe. –
Eğer mutex kullanmak istemiyorsanız, eşzamanlı kapları beklemeniz gerekir (C++ 17?). std::map
içinde std::atomic
işlemlerini kullanmak istiyorsanız, muhtemelen eşzamanlı atomik std::map
Internet'in tam olarak uygulanmasını veya bulunmasını istiyorsanız.
o zaman muhtemelen bu std::map
içeride sadece unsurları koruyacağını bilmek gerekir std::atomic
arasında std::map
kullanmak istiyorum, ancak kendine değil std::map
edin.
C++ 17 öyle. sabır bir erdemdir –
Haritanızı muteks ile korumanız gerekir. Ayrıca şu şablon sınıfına da bakabilirsiniz: https://github.com/Kicer86/openlibrary/blob/master/src/putils/ts_resource.hpp herhangi bir nesneyi sarar ve threadafe yapar. –
[Çift kopya] (http://stackoverflow.com/questions/14338732/is-it-possbile-to-implement-lock-free-map-in-c) – holtavolt
@holtavolt: Görünüşe göre bu benim sorusu, "std :: map", mutex "olmaksızın" std :: map "(diğer bir deyişle standart olmayan birleştirici haritalar) seçeneklerine bakıldığında, diğer bir işlemin" std :: map "(mutekssiz) harita kullanılarak elde edilip edilmediğini araştırır. std :: map' yeterince esnek değil. Bu sorunun cevabı okuyuculara diğer sorulara da yol açabilir .... –