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:
|
_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
Najlepsze praktyki i przykłady (SAL)