2015-04-27 28 views
7

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?

+0

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. –

+0

[Çift kopya] (http://stackoverflow.com/questions/14338732/is-it-possbile-to-implement-lock-free-map-in-c) – holtavolt

+0

@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 .... –

cevap

7

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


, sen bir düğüm ekledikten demek 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.

+0

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

+0

@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. –

1

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.

+0

C++ 17 öyle. sabır bir erdemdir –

İlgili konular