잠금 동작에 주석 지정
다중 스레드 프로그램에서 동시성 버그를 방지 하려면 항상 잠금에 적절 한 분야를 따르고 SAL 주석을 사용 합니다.
동시성 버그를 재현 하 고 진단, 명확 하지 않은 때문에 디버그 굉장히 어렵습니다.인터리빙 스레드에 대 한 이유 기껏해야 어려운 이므로 몇 개의 스레드가 코드 본문을 디자인 하는 경우 실용적이 지 않습니다.따라서 다중 스레드 프로그램은 잠금 분야를 수행 하는 것이 좋습니다.예를 들어, 여러 개의 잠금을 확보 하기 위해 교착 상태를 방지할 수 있습니다. 하지만 잠금 순서 만들어지자마자 및 공유 리소스에 액세스 하기 전에 적절 한 guarding 잠금 획득 경쟁 조건이 방지할 수 있습니다.
불행 하 게도 겉보기 간단한 잠금 규칙 연습을 수행 하려면 상당히 어려울 수 있습니다.오늘날의 프로그래밍 언어와 컴파일러의 기본 제한 들은 직접 사양 및 동시성 요구 사항을 분석 지원 하지 않는 것입니다.프로그래머는 잠금을 사용 하는 방법에 대 한 자신의 의도 표현할 수 있는 비공식적인 코드 주석을 사용 해야 합니다.
동시성 SAL 주석은 잠금 잠금 책임, 데이터 guardianship, 잠금 순서로 계층 구조의 다른 예상 되는 잠금 동작은 의도 지정할 수 있도록 설계 되었습니다.암시적 규칙 명시적 만드는 SAL 동시성 주석을 코드 잠금 규칙을 사용 하는 방법을 문서화 하는 일관 된 방식으로 제공 합니다.또한이 주석 동시성 경합 상태, 교착 상태, 일치 하지 않는 동기화 작업 및 기타 미묘한 동시성 오류를 찾을 수 있는 기능을 코드 분석 도구를 향상 시킵니다.
일반 지침
주석을 사용 하 여 구현 (호출 수신자)과 클라이언트 (호출자) 사이의 함수 정의에서 묵시적 계약 상태 수 및 익스프레스 고정 및 기타 속성을 추가 수 있습니다 프로그램의 분석을 개선 합니다.
SAL을 지 원하는 다양 한 종류의 잠금 기본 형식-예를 들어, 임계 섹션, 뮤텍스, 스핀 잠금 및 기타 리소스 개체입니다.대부분 동시성 주석 잠금 식을 매개 변수로 사용합니다.규칙에 따라 내부 잠금 개체 경로 식이 잠금을 표시 합니다.
기억해 야 할 몇 가지 스레드 소유권 규칙:
스핀 잠금은 일반 스레드 소유권을 가져야 하는 무제한 (uncounted) 잠금 됩니다.
뮤텍스 및 임계 일반 스레드 소유권을 가져야 하는 잠금 나열 됩니다.
세마포 및 이벤트 지우기 스레드가 소유 하지 않은 잠금을 나열 됩니다.
잠금 주석
다음 표에서 잠금 주석이 나열 됩니다.
주석 |
설명 |
---|---|
_Acquires_exclusive_lock_(expr) |
에 게시 상태 함수 하나씩 여 인 잠금 개체의 단독 잠금을 수 증가 나타내며 함수에 주석을 달아 expr. |
_Acquires_lock_(expr) |
에 게시 상태 함수 하나씩 여 라는 잠금 개체의 잠금 횟수 증가 나타내며 함수에 주석을 달아 expr. |
_Acquires_nonreentrant_lock_(expr) |
여 인 잠금 expr 획득 합니다.잠금이 이미 보유 하 고 있으면 오류가 보고 됩니다. |
_Acquires_shared_lock_(expr) |
에 게시 상태 함수 하나에 의해 공유 잠금 수가 잠금 개체에서 명명 증가 나타내며 함수에 주석을 달아 expr. |
_Create_lock_level_(name) |
기호를 선언 하는 문을 name 의 주석을 사용할 수 있도록 잠금 수준으로 _Has_Lock_level_ 및 _Lock_level_order_. |
_Has_lock_kind_(kind) |
리소스 개체의 형식 정보를 구체화 하는 개체를 주석을 답니다.다른 종류의 리소스에 대 한 공용 형식이 사용 되기도 하 고 오버 로드 된 형식 의미 요구 사항을 다양 한 자원 들을 구분 하기 위해 충분 하지 않습니다.다음은 목록에 미리 정의 된 kind 매개 변수:
|
_Has_lock_level_(name) |
잠금 개체에 주석을 달아 고 해당 잠금 수준을 name. |
_Lock_level_order_(name1, name2) |
잠금 간의 순서는 문을 name1 및 name2. |
_Post_same_lock_(expr1, expr2) |
함수에 주석을 달아 나타내고 게시물에 두 가지 잠금 상태는 expr1 및 expr2, 동일한 잠금 개체 처럼 처리 됩니다. |
_Releases_exclusive_lock_(expr) |
주석을 추가 하는 함수 및 게시물을 함수 감소 하나 단독 잠금 수 여 라는 잠금 개체의 상태를 나타내는 expr. |
_Releases_lock_(expr) |
주석을 추가 하는 함수 및 게시물을 함수 감소 씩 잠금 수 여 라는 잠금 개체의 상태를 나타내는 expr. |
_Releases_nonreentrant_lock_(expr) |
여 인 잠금 expr 해제 됩니다.현재 잠금을 보유 됩니다 경우 오류가 보고 됩니다. |
_Releases_shared_lock_(expr) |
주석을 추가 하는 함수 및 게시물을 함수 감소 공유 잠금 수가 잠금 개체에서 명명 한 상태를 나타내는 expr. |
_Requires_lock_held_(expr) |
함수에 주석을 달아 나타내고 사전에 잠금 횟수에서 명명 된 개체의 상태는 expr 하나입니다. |
_Requires_lock_not_held_(expr) |
함수에 주석을 달아 나타내고 사전에 잠금 횟수에서 명명 된 개체의 상태는 expr 0입니다. |
_Requires_no_locks_held_ |
주석을 추가 하는 함수 및 검사기에 알려진 모든 잠금의 잠금 횟수를 0이 있음을 나타냅니다. |
_Requires_shared_lock_held_(expr) |
함수에 주석을 달아 나타내고 사전에 공유 잠금 개수에서 명명 된 개체의 상태는 expr 하나입니다. |
_Requires_exclusive_lock_held_(expr) |
주석을 추가 하는 함수 및 사전에서에서 명명 된 개체의 단독 잠금을 카운트를 상태를 나타내는 expr 하나입니다. |
노출 되지 않은 잠금 개체에 대 한 SAL 내장
특정 잠금 개체 잠금 관련 함수의 구현에서 노출 되지 않습니다.다음 표에서 이러한 노출 되지 않은 잠금 개체에 작동 하는 함수에 대 한 주석 사용 SAL 내장 변수를 나열 합니다.
주석 |
설명 |
---|---|
_Global_cancel_spin_lock_ |
취소 스핀 잠금을 설명합니다. |
_Global_critical_region_ |
중요 한 영역에 설명 합니다. |
_Global_interlock_ |
연동된 작업에 설명 합니다. |
_Global_priority_region_ |
우선 순위 영역에 설명 합니다. |
공유 데이터 액세스 주석
다음 표에서 공유 데이터 액세스에 대 한 주석.
주석 |
설명 |
---|---|
_Guarded_by_(expr) |
변수에 주석을 추가 하 고 때마다 변수 액세스 되는 것을 나타내는 잠금 수 여 라는 잠금 개체의 expr 적어도 하나입니다. |
_Interlocked_ |
변수 주석을 달아와 같습니다 _Guarded_by_(_Global_interlock_). |
_Interlocked_operand_ |
주석이 지정 된 함수 매개 변수는 대상 피연산자 Interlocked는 다양 한 기능 중 하나입니다.해당 피연산자에는 특정 추가 속성이 있어야 합니다. |
_Write_guarded_by_(expr) |
변수에 주석을 추가 하 고 때마다 변수는 수정, 여 인 잠금 개체 잠금 개수 것 expr 하나입니다. |