Aracılığıyla paylaş


Kilitlenme Davranışını Yorumlama

Çok iş parçacıklı programınızda eşzamanlılık hatalarını önlemek için her zaman uygun bir kilitleme uzmanlık alanını izleyin ve SAL ek açıklamalarını kullanın.

Eşzamanlılık hataları belirlenimci olmadığından yeniden oluşturmak, tanılamak ve hatalarını ayıklamak oldukça zordur. İş parçacığı araya ekleme hakkında düşünmek en iyi şekilde zordur ve birkaç iş parçacığından daha fazla iş parçacığı içeren bir kod gövdesi tasarlarken pratik olmaz. Bu nedenle, çok iş parçacıklı programlarınızda kilitleme disiplinini takip etmek iyi bir uygulamadır. Örneğin, birden çok kilit alırken bir kilit emrine uymak kilitlenmeleri önlemeye yardımcı olur ve paylaşılan bir kaynağa erişmeden önce uygun koruma kilidinin alınması yarış koşullarını önlemeye yardımcı olur.

Ne yazık ki, görünüşte basit görünen kilitleme kurallarını uygulamada takip etmek şaşırtıcı derecede zor olabilir. Günümüzün programlama dillerinde ve derleyicilerinde temel bir sınırlama, eşzamanlılık gereksinimlerinin belirtimini ve analizini doğrudan desteklememeleridir. Programcıların kilitleri nasıl kullandıklarıyla ilgili amaçlarını ifade etmek için resmi olmayan kod açıklamalarına güvenmeleri gerekir.

Eşzamanlılık SAL ek açıklamaları, kilitleme yan etkilerini, kilitleme sorumluluğunu, veri koruyuculuğu, kilit sırası hiyerarşisini ve diğer beklenen kilitleme davranışını belirtmenize yardımcı olmak için tasarlanmıştır. Örtük kuralları açık hale getirerek, SAL eşzamanlılık ek açıklamaları kodunuzun kilitleme kurallarını nasıl kullandığını belgelemeniz için tutarlı bir yol sağlar. Eşzamanlılık ek açıklamaları, kod analizi araçlarının yarış koşullarını, kilitlenmeleri, uyumsuz eşitleme işlemlerini ve diğer hafif eşzamanlılık hatalarını bulma becerisini de geliştirir.

Genel Yönergeler

Ek açıklamaları kullanarak, uygulamalar (çağrılar) ve istemciler (arayanlar) arasında işlev tanımları tarafından ima edilen sözleşmeleri belirtebilirsiniz. Ayrıca, analizi daha da geliştirebilecek sabitleri ve programın diğer özelliklerini de ifade edebilirsiniz.

SAL, kritik bölümler, köşeler, döndürme kilitleri ve diğer kaynak nesneleri gibi birçok farklı kilitleme temel öğesini destekler. Birçok eşzamanlılık ek açıklaması, parametre olarak bir kilit ifadesi alır. Kural gereği kilit, temel alınan kilit nesnesinin yol ifadesiyle belirtilir.

Dikkate almanız gereken bazı iş parçacığı sahipliği kuralları:

  • Döndürme kilitleri, açık iş parçacığı sahipliğine sahip hesaplanmamış kilitlerdir.

  • Mutex'ler ve kritik bölümler, açık iş parçacığı sahipliğine sahip kilitler olarak sayılır.

  • Semaforlar ve olaylar, açık iş parçacığı sahipliğine sahip olmayan kilitler olarak sayılır.

Ek Açıklamaları Kilitleme

Aşağıdaki tabloda kilitleme ek açıklamaları listeleniyor.

Ek Açıklama Tanım
_Acquires_exclusive_lock_(expr) Bir işleve ek açıklama ekler ve post durumunda işlevin tarafından adlandırılan exprkilit nesnesinin özel kilit sayısını bir artırdığını gösterir.
_Acquires_lock_(expr) bir işleve ek açıklama ekler ve post durumunda işlevin tarafından adlandırılan exprkilit nesnesinin kilit sayısını bir artırdığını gösterir.
_Acquires_nonreentrant_lock_(expr) tarafından expr adlandırılan kilit alınır. Kilit zaten tutulduysa bir hata bildirilir.
_Acquires_shared_lock_(expr) Bir işleve ek açıklama ekler ve post durumunda işlevin tarafından adlandırılan exprkilit nesnesinin paylaşılan kilit sayısını bir artırdığını gösterir.
_Create_lock_level_(name) ve ek açıklamalarında _Has_Lock_level__Lock_level_order_kullanılabilmesi için simgenin name bir kilit düzeyi olduğunu bildiren bir deyim.
_Has_lock_kind_(kind) Kaynak nesnesinin tür bilgilerini daraltmak için herhangi bir nesneye ek açıklama ekler. Bazen farklı kaynak türleri için ortak bir tür kullanılır ve aşırı yüklenmiş tür, çeşitli kaynaklar arasındaki anlamsal gereksinimleri ayırt etmek için yeterli değildir. Önceden tanımlanmış kind parametrelerin listesi aşağıdadır:

_Lock_kind_mutex_
Mutexes için tür kimliğini kilitleyin.

_Lock_kind_event_
Olaylar için tür kimliğini kilitleyin.

_Lock_kind_semaphore_
Semaforlar için tür kimliğini kilitleyin.

_Lock_kind_spin_lock_
Dönüş kilitleri için kilit türü kimliği.

_Lock_kind_critical_section_
Kritik bölümler için tür kimliğini kilitleyin.
_Has_lock_level_(name) Bir kilit nesnesine ek açıklama ekler ve kilit düzeyini nameverir.
_Lock_level_order_(name1, name2) ve name2arasında name1 kilit sıralamasını veren bir deyim. Düzeyi olan kilitler, düzeyi name1 olan name2kilitlerden önce alınmalıdır.
_Post_same_lock_(expr1, expr2) Bir işleve ek açıklama ekler ve post durumunda iki kilidin expr1 ve expr2öğelerinin aynı kilit nesnesi gibi davranıldığını gösterir.
_Releases_exclusive_lock_(expr) Bir işleve ek açıklama ekler ve post durumunda işlevin tarafından adlandırılan exprkilit nesnesinin özel kilit sayısı kadar azaldığını gösterir.
_Releases_lock_(expr) Bir işleve ek açıklama ekler ve post durumunda işlevin tarafından adlandırılan exprkilit nesnesinin kilit sayısı kadar azaldığını gösterir.
_Releases_nonreentrant_lock_(expr) tarafından expr adlandırılan kilit serbest bırakılır. Kilit şu anda tutulmuyorsa bir hata bildirilir.
_Releases_shared_lock_(expr) Bir işleve ek açıklama ekler ve post durumunda işlevin tarafından adlandırılan exprkilit nesnesinin paylaşılan kilit sayısıyla azaldığını gösterir.
_Requires_lock_held_(expr) bir işleve not ekler ve ön durumda tarafından expr adlandırılan nesnenin kilit sayısının en az bir olduğunu gösterir.
_Requires_lock_not_held_(expr) bir işleve ek açıklama ekler ve ön durumda tarafından expr adlandırılan nesnenin kilit sayısının sıfır olduğunu gösterir.
_Requires_no_locks_held_ bir işleve ek açıklama ekler ve denetleyici tarafından bilinen tüm kilitlerin kilit sayılarının sıfır olduğunu gösterir.
_Requires_shared_lock_held_(expr) bir işleve ek açıklama ekler ve ön durumda tarafından expr adlandırılan nesnenin paylaşılan kilit sayısının en az bir olduğunu gösterir.
_Requires_exclusive_lock_held_(expr) İşleve ek açıklama ekler ve ön durumda tarafından expr adlandırılan nesnenin özel kilit sayısının en az bir olduğunu gösterir.

Sal Intrinsics For Unexposeding Objects

Belirli kilit nesneleri, ilişkili kilitleme işlevlerinin uygulanması tarafından gösterilmez. Aşağıdaki tabloda, bu kullanıma sunulmamış kilit nesneleri üzerinde çalışan işlevlerde ek açıklamaları etkinleştiren SAL iç değişkenleri listelenmektedir.

Ek Açıklama Tanım
_Global_cancel_spin_lock_ İptal döndürme kilidini açıklar.
_Global_critical_region_ Kritik bölgeyi açıklar.
_Global_interlock_ Birbirine kenetlenmiş işlemleri açıklar.
_Global_priority_region_ Öncelik bölgesini açıklar.

Paylaşılan Veri Erişimi Ek Açıklamaları

Aşağıdaki tabloda paylaşılan veri erişimine yönelik ek açıklamalar listelemektedir.

Ek Açıklama Tanım
_Guarded_by_(expr) Bir değişkene ek açıklama ekler ve değişkene her erişildiğinde tarafından adlandırılan expr kilit nesnesinin kilit sayısının en az bir olduğunu gösterir.
_Interlocked_ Bir değişkene ek açıklama ekler ve ile _Guarded_by_(_Global_interlock_)eşdeğerdir.
_Interlocked_operand_ Açıklamalı işlev parametresi, çeşitli Kilitlenmiş işlevlerden birinin hedef işlenenidir. Bu işlenenler belirli ek özelliklere sahip olmalıdır.
_Write_guarded_by_(expr) Bir değişkene ek açıklama ekler ve değişken her değiştirildiğinde tarafından adlandırılan expr kilit nesnesinin kilit sayısının en az bir olduğunu gösterir.

Akıllı Kilit ve RAII Ek Açıklamaları

Akıllı kilitler genellikle yerel kilitleri sarmalar ve yaşamlarını yönetir. Aşağıdaki tabloda, semantik desteğine move sahip akıllı kilitler ve RAII kodlama desenleriyle kullanılabilecek ek açıklamalar listelanmaktadır.

Ek Açıklama Tanım
_Analysis_assume_smart_lock_acquired_(lock) Çözümleyiciye akıllı kilidin alındığını varsaymalarını söyler. Bu ek açıklama, parametresi olarak bir başvuru kilit türü bekler.
_Analysis_assume_smart_lock_released_(lock) Çözümleyiciye akıllı kilidin serbest bırakıldığını varsaymalarını söyler. Bu ek açıklama, parametresi olarak bir başvuru kilit türü bekler.
_Moves_lock_(target, source) Kilit durumunu nesnesinden source öğesine targetaktaran bir move constructor işlemi açıklar. target yeni yapılandırılmış bir nesne olarak kabul edilir, bu nedenle daha önce sahip olduğu herhangi bir durum kaybolur ve durumla source değiştirilir. source ayrıca, kilit sayısı veya diğer ad hedefi olmadan temiz bir duruma sıfırlanır, ancak buna işaret eden diğer adlar değişmeden kalır.
_Replaces_lock_(target, source) move assignment operator Durumu kaynaktan aktarmadan önce hedef kilidin serbest bırakıldığı semantiği açıklar. Bunu, önünde _Releases_lock_(target)bir birleşimi _Moves_lock_(target, source) olarak kabul edebilirsiniz.
_Swaps_locks_(left, right) Nesnelerin leftright durumlarını değiştirdiğini varsayan standart swap davranışı açıklar. Değiştirilen durum, varsa kilit sayısını ve diğer ad belirleme hedefini içerir. ve right nesnelerine left işaret eden diğer adlar değişmeden kalır.
_Detaches_lock_(detached, lock) Bir kilit sarmalayıcı türünün içerdiği kaynakla ilişkilendirmeye izin verdiği bir senaryo açıklanmaktadır. İç işaretçisiyle çalışma std::unique_ptr şekline benzer: Programcıların işaretçiyi ayıklamasına ve akıllı işaretçi kapsayıcısını temiz durumda bırakmasına olanak tanır. Benzer mantık tarafından std::unique_lock desteklenir ve özel kilit sarmalayıcılarında uygulanabilir. Ayrılmış kilit durumunu korur (varsa kilit sayısı ve diğer ad hedefi), sarmalayıcı sıfır kilit sayısı içerecek şekilde sıfırlanır ve kendi diğer adlarını korurken hiçbir diğer ad hedefi içermez. Kilit sayılarında işlem yoktur (serbest bırakma ve alma). Bu ek açıklama, ayrılmış bağımsız değişkenin yerine thisolması return dışında tam olarak olarak _Moves_lock_ davranır.

Ayrıca bkz.