Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ç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ı belirsiz 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 | Açıklama |
---|---|
_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 name _Has_Lock_level_ kullanılabilmesi için simgenin _Lock_level_order_ 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 name1 arasında name2 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_(dst, src) |
Bir işleve ek açıklama ekler ve post durumunda iki kilidin dst ve src 'den kilit özellikleri src dst uygulanarak 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 | Açıklama |
---|---|
_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 | Açıklama |
---|---|
_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şlenenlerin başka belirli özellikleri 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, akıllı kilitlerle kullanılabilen ek açıklamalar ve semantik desteğine move
sahip Kaynak Alımı Başlatma (RAII) kodlama desenleri listelenir.
Ek Açıklama | Açıklama |
---|---|
_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 move constructor öğesine source aktaran bir target 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 _Moves_lock_(target, source) bir birleşimi _Releases_lock_(target) olarak kabul edebilirsiniz. |
_Swaps_locks_(left, right) |
Nesnelerin swap left durumlarını değiştirdiğini varsayan standart right davranışı açıklar. Değiştirilen durum, varsa kilit sayısını ve diğer ad belirleme hedefini içerir. ve left nesnelerine right 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 _Moves_lock_ olması return dışında tam olarak olarak this davranır. |