2011-11-22 34 views
8

Bu, std::map'un dişli güvenliği hakkındadır. Şimdi, eşzamanlı okumalar iş parçacığı güvenlidir, ancak yazmalar değildir. Sorum şu ki, her seferinde haritaya benzersiz bir öğe eklersek, iş parçacığı güvenli mi olacak? Bu std:map<int, std::string> myMap gibi bir harita varsa veC++ haritalarının iş parçacığı güvenliği

  1. Yani, bir örnek için, ben her zaman yeni anahtarlar eklemek ve asla mevcut anahtar değerini değiştirmek, o iş parçacığı güvenli olacak?

  2. Daha da önemlisi, bana herhangi bir rastgele çalışma zamanı davranışı verecek mi?

  3. Yeni anahtarlar eklemek de değişiklik sayılır mı? Anahtarlar eklerken her zaman farklıysa, hafızanın bağımsız bir bölümünü değiştirdiği için iş parçacığı güvenli olmamalıdır?

Teşekkür Tabii Shiv

+0

Hayır, bu iş parçacığı için güvenli olmayacaktır, çünkü iki iş parçacığı aynı anda aynı yere gidecek şekilde iki (benzersiz) öğe ekleyebilir. –

+0

Standart konteynırlardan bekleyebildiğiniz tek tip iplik güvenliği, eğer konteyner hiçbir zaman değiştirilmediyse ve her bir iplik bir ** farklı ** elemanına erişirse (okur ya da yazarsa), o zaman bu iyi olmalıdır. –

cevap

14

1) değil

2) Evet, sana en geç

3) Evet, öyle, test sırasında bunu karşılaşacağınız umuyoruz. Yeni eleman farklı bir yere eklendi, ancak bu sırada birçok işaretçi değiştirildi.

Harita, tüm uygulamalarda olmasa bile bir çeşit ağaç tarafından uygulanır. Ağaca yeni bir eleman eklemek, farklı düğümlere işaret etmek için işaretleyicileri sıfırlamak suretiyle düğümleri yeniden düzenleyerek değiştirir. Bu nedenle

+1

+1, tam olarak .... –

+0

@armen o zaman en iyi alternatif nedir? –

+0

@EdwinVivekN: Eşzamanlı olarak STL konteynerlerle çalışırken harici senkronizasyon mekanizmalarını (örneğin, muteksler) kullanmanız gerekir –

0

no, evet, evet. Konteyneri değiştirirken (yeni anahtarların eklenmesi dahil) özel bir kilit elde etmeniz gerekir, ancak üzerinde herhangi bir değişiklik yapılmazken, elbette güvenli bir şekilde aynı anda okunabilir.

düzenleme: http://www.sgi.com/tech/stl/thread_safety.html sizin için ilgi çekici olabilir.

İlgili konular