다음을 통해 공유


잠금 동작에 주석 지정

다중 스레드 프로그램에서 동시성 버그를 방지 하려면 항상 잠금에 적절 한 분야를 따르고 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 매개 변수:

_Lock_kind_mutex_

뮤텍스 잠금 종류 Id입니다.

_Lock_kind_event_

이벤트에 대 한 잠금 종류 ID

_Lock_kind_semaphore_

세마포를 잠금 종류 ID

_Lock_kind_spin_lock_

스핀 잠금에 대 한 잠금 종류 ID

_Lock_kind_critical_section_

중요 섹션에 대 한 잠금 종류 ID

_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 하나입니다.

참고 항목

참조

함수 매개 변수 및 반환 값에 주석 지정

함수 동작에 주석 지정

구조체 및 클래스에 주석 지정

주석 적용 시기 및 위치 지정

내장 함수

모범 사례 및 예제(SAL)

개념

SAL 이해

기타 리소스

C/C++ 코드 오류를 줄이기 위한 SAL 주석 사용

코드 분석 팀 블로그