Udostępnij za pośrednictwem


Dodawanie adnotacji do zachowania blokującego

Aby uniknąć błędów współbieżności w programie wielowątkowe, zawsze należy wykonać odpowiednie dyscypliny blokowania i SAL adnotacji można używać.

Współbieżność błędy są bardzo trudne do odtworzenia, zdiagnozowanie i debugowania, ponieważ są one deterministyczny.Wyobrażenie o tym, z przeplotem wątek jest trudne w najlepszym i staje się niepraktyczne, podczas projektowania jednostka kodu, który ma więcej niż kilka wątków.Dlatego też wykonać blokowania dyscypliny w wielowątkowych programach.Na przykład przestrzeganie kolejności blokada, gdy pobieranie blokady wielu pomaga unikać zakleszczeń i pobieranie właściwego blokada systemy ochronne przed uzyskaniem dostępu do zasobu udostępnionego zapobiega wyścigu.

Niestety pozornie proste zasady blokowania może być zaskakująco trudno śledzić w praktyce.Podstawowym ograniczeniem we współczesnych językach programowania i kompilatorach jest to, że nie obsługują bezpośrednio specyfikacji i analizy wymagań współbieżności.Programiści muszą polegać na nieformalny komentarze do wyrażania swoich zamiarach o jak ich używać blokad.

Współbieżność SAL adnotacje mają na celu pomóc określić blokowania skutków ubocznych, blokowania odpowiedzialność, kurateli danych, hierarchii kolejności blokowania i inne oczekiwane zachowanie blokowania.Dokonując niejawna zasad jawnych, SAL współbieżności adnotacje zapewniają spójny sposób dla Ciebie do dokumentu, jak kod używa reguły blokowania.Adnotacje współbieżności również zwiększyć możliwości tych narzędzi do analizy kodu znaleźć wyścigu, zakleszczenia, operacji synchronizacji niedopasowane i inne błędy subtelne współbieżności.

Ogólne wytyczne

Za pomocą adnotacji, podaj kontrakty, które są implikowane przez definicje funkcji między implementacjami (zapobieganie) i klientami (połączenia z terenu), a ekspresowe niezmienny i inne właściwości programu, który można dodatkowo poprawić analizy.

SAL obsługuje wiele różnych rodzajów blokowania proste kształty — na przykład sekcje krytyczne, muteksy, blokad ze strzałkami i innych obiektów zasobów.Wiele adnotacji współbieżności pobiera wyrażenie blokujące jako parametr.Zgodnie z konwencją, blokada jest oznaczona poprzez wyrażenie ścieżki źródłowego obiektu blokady.

Niektóre reguły własność wątku należy pamiętać:

  • SPIN blokady są niezliczone blokad, które mają posiadania przez wątek jasne.

  • Muteksy i sekcje krytyczne są zliczane blokad, które mają posiadania przez wątek jasne.

  • Semafory i zdarzenia są liczone blokad, które nie mają posiadania przez wątek jasne.

Adnotacje blokowania

Poniższa lista zawiera adnotacje blokowania.

Adnotacja

Opis

_Acquires_exclusive_lock_(expr)

Opisz funkcję i wskazuje, że ogłoszenia w Państwie funkcja zwiększa o jeden blokada na wyłączność licznik zablokować obiektu, który ma taką samą nazwę expr.

_Acquires_lock_(expr)

Opisz funkcję i wskazuje, że ogłoszenia w Państwie funkcja zwiększa o jeden blokada licznik zablokować obiektu, który ma taką samą nazwę expr.

_Acquires_nonreentrant_lock_(expr)

Blokada, który ma taką samą nazwę expr został nabyty.Jeśli już blokadę zwróci błąd.

_Acquires_shared_lock_(expr)

Opisz funkcję i wskazuje, że ogłoszenia w Państwie funkcja zwiększa o jeden blokada współużytkowana licznik zablokować obiektu, który ma taką samą nazwę expr.

_Create_lock_level_(name)

Instrukcja, która deklaruje symbol name za poziom blokady tak, że mogą być stosowane w przypisach _Has_Lock_level_ i _Lock_level_order_.

_Has_lock_kind_(kind)

Zaopatruję w adnotację dowolny obiekt w celu zaktualizowania informacji o typie obiektu zasobu.Czasami wspólny typ jest używany dla różnych rodzajów zasobów i przeciążony typ nie jest wystarczający, aby odróżnić semantyczne wymagania wśród różnych zasobów.Poniżej przedstawiono listę wstępnie zdefiniowanych kind parametry:

_Lock_kind_mutex_

Identyfikator rodzaju blokady dla muteksów.

_Lock_kind_event_

Identyfikator rodzaju blokady dla zdarzeń.

_Lock_kind_semaphore_

Identyfikator rodzaju blokady dla semaforów.

_Lock_kind_spin_lock_

Identyfikator rodzaju blokady dla blokad spinlock.

_Lock_kind_critical_section_

Identyfikator rodzaju blokady dla sekcji krytycznych.

_Has_lock_level_(name)

Opisz obiekt blokady i nadaje mu poziom blokady name.

_Lock_level_order_(name1, name2)

Instrukcja, która nadaje kolejność blokad pomiędzy name1 i name2.

_Post_same_lock_(expr1, expr2)

Opisz funkcję i wskazuje, że w post stanowe dwóch blokad, expr1 i expr2, są traktowane tak, jakby były tym samym obiekcie blokady.

_Releases_exclusive_lock_(expr)

Opisz funkcję i wskazuje, że w post stanowe funkcja zmniejsza o jeden licznik blokady wyłącznej obiektu lock, który ma taką samą nazwę expr.

_Releases_lock_(expr)

Opisz funkcję i wskazuje, że w post stanowe funkcja zmniejsza o jeden licznik blokady obiektu lock, który ma taką samą nazwę expr.

_Releases_nonreentrant_lock_(expr)

Blokada, który ma taką samą nazwę expr jest zwolniony.Jeśli blokada nie jest aktualnie używana zwróci błąd.

_Releases_shared_lock_(expr)

Opisz funkcję i wskazuje, że w post stanowe funkcja zmniejsza o jeden liczbę blokada współużytkowana zablokować obiektu o nazwie expr.

_Requires_lock_held_(expr)

Opisz funkcję i wskazuje, że w pre stanowe liczba blokad obiektu, który ma taką samą nazwę expr jest co najmniej jeden.

_Requires_lock_not_held_(expr)

Opisz funkcję i wskazuje, że w pre stanowe liczba blokad obiektu, który ma taką samą nazwę expr jest równa zero.

_Requires_no_locks_held_

Opisz funkcję i wskazuje, że liczy blokada wszystkich blokad, które są znane do sprawdzania są zero.

_Requires_shared_lock_held_(expr)

Opisz funkcję i wskazuje, że w pre stanowe count blokada współużytkowana obiektu, który ma taką samą nazwę expr jest co najmniej jeden.

_Requires_exclusive_lock_held_(expr)

Opisz funkcję i wskazuje, że w pre stanowe licznik blokady wyłącznej obiektu, który ma taką samą nazwę expr jest co najmniej jeden.

Intrinsics SAL nienaświetlony blokowanie obiektów

Niektóre obiekty blokady nie są ujawniane przez implementację skojarzonych funkcji blokowania.Poniższa lista zawiera zmiennych wewnętrznych SAL, które Włącz adnotacje w funkcjach, które działają na te obiekty, nienaświetlony blokady.

Adnotacja

Opis

_Global_cancel_spin_lock_

W tym artykule opisano Anuluj pokrętła blokada.

_Global_critical_region_

W tym artykule opisano krytycznych obszarach.

_Global_interlock_

W tym artykule opisano operacje blokujące.

_Global_priority_region_

W tym artykule opisano regionu priorytet.

Adnotacje dostępu do danych współdzielonych

Poniższa lista zawiera adnotacje do współużytkowanych danych programu access.

Adnotacja

Opis

_Guarded_by_(expr)

Opisz zmienną i wskazuje, że gdy zmienna jest dostępne, liczba blokad obiektu lock, który ma taką samą nazwę expr jest co najmniej jeden.

_Interlocked_

Zaopatruje zmienną w adnotację i jest równoważne _Guarded_by_(_Global_interlock_).

_Interlocked_operand_

Parametr funkcji zaopatrzonej w adnotację jest docelowym argumentem operacji jednej z różnych funkcji Interlocked.Te argumenty operacji muszą mieć określone dodatkowe właściwości.

_Write_guarded_by_(expr)

Opisz zmienną i wskazuje, że gdy zmienna zostanie zmodyfikowany, liczba blokad obiektu lock, który ma taką samą nazwę expr jest co najmniej jeden.

Zobacz też

Informacje

Dodawanie adnotacji do parametrów funkcji i zwracanych wartości

Zachowanie funkcji dodawania adnotacji

Dodawanie adnotacji struktur i klas

Określanie warunków pojawiania się adnotacji

Funkcje wewnętrzne

Najlepsze praktyki i przykłady (SAL)

Koncepcje

Zrozumienie SAL

Inne zasoby

Za pomocą adnotacji SAL do zmniejszenia wady kod C/C++

Blog zespołu analizy kodu