2014-08-27 16 views
13

Özel belgeyi temsil eden Document sınıfı güvenli bir iş parçacığım var. Alıcının durumunu değiştirmek için getters (const işlevleri) ve setters var. Tüm bu işlevler, yöntem tamamen uygulanıncaya kadar belgenin değiştirilmeyeceğini garanti etmek için mutex korumalıdır. Muteks-kilitleme işlevi const olarak işaretlenebilir

Ama nedeniyle QMutex kullanım

i mutable kullanımı olmadan const olarak devlet erişilen işlev işaretleyemiyorsunuz. QMutex'u yakalamak, durumunu değiştirir.

Bu kod doğru mu, yoksa daha hoş bir şekilde yazılabilir mi? Halatsız mutable kullanımı.

class Document 
{ 
    // This method should be const: it changes only mutex 
    // and don't touch document state 
    bool IsCorrect() const; 
    ... 
    mutable QMutex m_lock; 
}; 

bool Document::IsCorrect() const 
{ 
    // Capturing mutex object change it! 
    QMutexLocker lock(&m_lock); 
    ... Const-aware code 
    bool result = (m_context != NULL); 
    ... 
    return result; 
} 
+9

Bu "mutable" kullanımı "hacky" değil ... tam olarak ne 'mutable' için var (ama münhasıran değil - örneğin, önbelleğe alma sonuçları, enstrümantasyon eşit derecede geçerli kullanımlar). –

+0

Başka bir "mutable" örneği, okunurken yenilenebilen bir önbellek (harici durumun dahili gösterimi) olabilir, bu nedenle bir okuma işlevi const ise bile, önbellek değişebilir, ancak bu durum, nesne değişti. – stefaanv

+0

@TonyD Şefim şöyle bir şey söylüyor: "const işlevi bir şeyi değiştirmemeli - ve mutex Belge durumunun bir parçası, onu değiştirerek örtülü olarak karıştırıyor". Ona mantıksal ve bitlenmezlik hakkında açıklama yapmalı mıyım? – eraxillan

cevap

18

Herb Sutter bu konu hakkında mükemmel bir talk on Channel9 sahiptir.

Burada önemli olan konu C++ 11, mutable'un iplik güvenliği ile ilgili yeni bir anlam kazanmasıdır: "bu veri üyesi dahili olarak senkronize edilmiştir." Tam olarak bir muteks budur. Herb, bu konuşmada bir muteks hakkında konuşurken bile şöyle der: "bu, değişebilir olmak ister."

Yani bir mutable Muteksleri sahip ve bir const üye işlevinden erişirken

hiç hacky değildir ve aslında mutable için birincil kullanım amaçları biri.

+0

Tamam, ben şimdi sakin ol Ancak, muteks tabanlı tasarımın en iyisi olmadığını buluyorum ama bu başka bir soru. – eraxillan