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 expr kilit 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 expr kilit 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 expr kilit 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 name verir. |
_Lock_level_order_(name1, name2) |
ve name2 arasında name1 kilit sıralamasını veren bir deyim. Düzeyi olan kilitler, düzeyi name1 olan name2 kilitlerden ö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 expr kilit 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 expr kilit 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 expr kilit 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 target aktaran 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 left right 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 this olması return dışında tam olarak olarak _Moves_lock_ davranır. |
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin