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 używania adnotacji SAL.
Współbieżność błędy są bardzo trudne do odtworzenia, diagnozowanie i debugowania, ponieważ są one deterministyczny.Rozumowanie o wątku z przeplotem jest trudne w najlepszym i staje się niepraktyczne podczas projektowania treści kodu, który ma więcej niż kilka wątków.Dlatego dobrą praktyką jest wykonaj blokowania dyscypliny w wielowątkowych programach.Na przykład przestrzeganie kolejności blokowania, podczas gdy pobieranie blokady wielu pomaga uniknąć zakleszczenia i pobieranie właściwego blokada systemy ochronne przed uzyskaniem dostępu do zasobu udostępnionego pomaga zapobiegać Sytuacje 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 mają opierać się na nieformalny komentarze do wyrażenia ich zamiary dotyczące wykorzystania do blokady.
Współbieżność SAL adnotacje mają na celu pomóc określić blokowania niepożądanych, blokowanie odpowiedzialność, kurateli danych, blokada kolejności hierarchii i inne oczekiwane zachowanie blokowania.Dokonując niejawna zasad jawnych, SAL współbieżność adnotacje zapewniają spójny sposób dla Ciebie do dokumentu, jak kod używa reguł blokowania.Adnotacje współbieżność zwiększa się również możliwość wyszukania Sytuacje wyścigu, zakleszczenia, operacji synchronizacji niedopasowane i inne błędy subtelne współbieżność narzędziami do analizowania kodu.
Ogólne wytyczne
Za pomocą adnotacji, można podać umów, które są implikowane przez definicji funkcji między implementacjami (callees) i klientów (wywołującym) i niezmienny express i inne właściwości programu, który może dodatkowo poprawić analizy.
SAL obsługuje wiele różnych rodzajów prymitywów blokowania — na przykład sekcji krytycznych, muteksy, blokady pokrętła 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 warto pamiętać:
SPIN blokady są niezliczone blokad, które mają własności jasne wątku.
Muteksy i sekcje krytyczne są zliczane blokad, które mają własności jasne wątku.
Semafory i zdarzenia są zliczane blokad, które nie mają własność jasne wątku.
Adnotacje blokowania
Poniższa lista zawiera adnotacje blokowania.
Adnotacja |
Opis |
---|---|
_Acquires_exclusive_lock_(expr) |
Opisz funkcji i wskazuje, że w ogłoszeniu stanu funkcji zwiększa przez jedną licznik blokady wyłącznej zablokować obiektu o nazwie expr. |
_Acquires_lock_(expr) |
Opisz funkcji i wskazuje, że ogłoszenia w stan funkcji zwiększa o jeden liczba blokad obiektu blokady, o nazwie expr. |
_Acquires_nonreentrant_lock_(expr) |
Blokada, który nazywa się przez expr został nabyty. Jeśli się już blokada zwróci błąd. |
_Acquires_shared_lock_(expr) |
Opisz funkcji i wskazuje, że ogłoszenia w stan funkcji zwiększa o jeden blokada współużytkowana liczbę obiektu blokady, o nazwie expr. |
_Create_lock_level_(name) |
Oświadczenie, że deklaruje symbol name się 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 obiektu 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 funkcji i wskazuje w ogłoszeniu podać dwa blokad, expr1 i expr2, są traktowane tak, jakby tego samego obiektu blokady. |
_Releases_exclusive_lock_(expr) |
Opisz funkcji i wskazuje, że w ogłoszeniu Państwa Dekrementuje funkcji o jeden licznik blokady wyłącznej zablokować obiektu o nazwie expr. |
_Releases_lock_(expr) |
Opisz funkcji i wskazuje, że w ogłoszeniu Państwa Dekrementuje funkcji o jeden licznik blokad obiektu blokady, o nazwie expr. |
_Releases_nonreentrant_lock_(expr) |
Blokada, który nazywa się przez expr jest zwolniony.Błąd jest zgłaszany, jeżeli blokada nie jest aktualnie używana. |
_Releases_shared_lock_(expr) |
Opisz funkcji i wskazuje, że w ogłoszeniu Państwa Dekrementuje funkcji o jeden licznik blokada współużytkowana zablokować obiektu o nazwie expr. |
_Requires_lock_held_(expr) |
Opisz funkcji i wskazuje w pre Państwie liczba blokad obiektu o nazwie expr jest co najmniej jeden. |
_Requires_lock_not_held_(expr) |
Opisz funkcji i wskazuje w pre Państwie liczba blokad obiektu o nazwie expr wynosi zero. |
_Requires_no_locks_held_ |
Opisz funkcji i wskazuje, że blokada liczby wszystkich blokad, które są znane do sprawdzania zero. |
_Requires_shared_lock_held_(expr) |
Opisz funkcji i wskazuje w pre Państwie liczba blokad udostępnionego obiektu o nazwie expr jest co najmniej jeden. |
_Requires_exclusive_lock_held_(expr) |
Opisz funkcji i wskazuje w pre podać licznik blokady wyłącznej obiektu o nazwie expr jest co najmniej jeden. |
Intrinsics SAL nienaświetlone blokowanie obiektów
Niektóre obiekty blokady nie są ujawniane przez implementację skojarzonych funkcji blokowania. Poniższa tabela zawiera listę zmiennych wewnętrznych SAL, które Włącz adnotacje w funkcjach, które działają na tych obiektów, blokady nienaświetlone.
Adnotacja |
Opis |
---|---|
_Global_cancel_spin_lock_ |
W tym artykule opisano blokady pokrętła Anuluj. |
_Global_critical_region_ |
W tym artykule opisano krytyczne regionu. |
_Global_interlock_ |
W tym artykule opisano operacje zablokowane. |
_Global_priority_region_ |
W tym artykule opisano regionu priorytet. |
Adnotacje dostępu do danych współdzielonych
Poniższa lista zawiera adnotacje do dostępu do danych udostępnionych.
Adnotacja |
Opis |
---|---|
_Guarded_by_(expr) |
Opisz zmiennej i wskazuje, że gdy zmienna jest dostępne, liczba blokad obiektu blokady, o nazwie 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 zmiennej i wskazuje, że gdy zmienna jest, liczba blokad obiektu blokady, o nazwie 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)
Koncepcje
Inne zasoby
Korzystanie z adnotacji SAL w celu redukowanie defektów kodu C/C++