문제

잠금을 통해 한 번에 하나의 스레드만 잠긴 데이터에 액세스하도록 하면 잠금 기능에 대한 액세스를 제어하는 ​​것은 무엇입니까?

나는 그렇게 생각했다 부스트::뮤텍스::scoped_lock 지역 변수가 다른 스레드에 의해 예기치 않게 수정되지 않도록 각 함수의 시작 부분에 있어야 합니다. 맞나요?두 스레드가 매우 가까운 시간에 잠금을 획득하려고 하면 어떻게 되나요?내부적으로 사용되는 잠금의 지역 변수가 다른 스레드에 의해 손상되지 않습니까?

내 질문은 부스트에만 국한된 것이 아니지만 다른 것을 추천하지 않는 한 아마도 그것을 사용할 것입니다.

도움이 되었습니까?

해결책

맞습니다. 잠금을 구현할 때 두 프로세스가 동시에 잠금을 얻지 않도록 보장하는 방법이 필요합니다.이렇게 하려면 중단 없이 완료가 보장되는 원자적 명령을 사용해야 합니다.그러한 지시 중 하나는 테스트 및 설정, 부울 변수의 상태를 가져와 이를 true로 설정하고 이전에 검색된 상태를 반환하는 작업입니다.

이것이 하는 일은 잠금을 얻을 수 있는지 확인하기 위해 지속적으로 테스트하는 코드를 작성할 수 있다는 것입니다.x가 스레드 간 공유 변수라고 가정합니다.

while(testandset(x));
// ...
// critical section
// this code can only be executed by once thread at a time
// ...
x = 0; // set x to 0, allow another process into critical section

다른 스레드는 임계 섹션에 들어갈 때까지 계속해서 잠금을 테스트하므로 이는 상호 배제를 보장하는 매우 비효율적인 방법입니다.그러나 이 간단한 개념을 사용하면 훨씬 더 효율적인 세마포어와 같은 더 복잡한 제어 구조를 구축할 수 있습니다(프로세스가 반복되지 않고 휴면 상태이기 때문입니다).

다른 팁

공유 데이터에 대한 독점적인 액세스 권한만 있으면 됩니다.정적이거나 힙에 있지 않는 한 함수 내부의 지역 변수는 스레드마다 다른 인스턴스를 가지므로 걱정할 필요가 없습니다.그러나 공유 데이터(예: 포인터를 통해 액세스되는 항목)는 먼저 잠겨야 합니다.

잠금 작동 방식은 경쟁 조건을 방지하도록 세심하게 설계되었으며 원자성을 보장하기 위해 하드웨어 수준 지원을 받는 경우가 많습니다.IE에는 원자성이 보장되는 일부 기계 언어 구성이 있습니다.세마포어(및 뮤텍스)는 이를 통해 구현될 수 있습니다.

가장 간단한 설명은 아래에 있는 잠금이 원자성이 보장되고 스레드 간에 충돌할 수 없는 하드웨어 명령을 기반으로 한다는 것입니다.

함수의 일반 지역 변수는 이미 개별 스레드에만 적용됩니다.잠금을 통해 보호해야 하는 여러 스레드가 동시에 액세스할 수 있는 것은 정적, 전역 또는 기타 데이터뿐입니다.

잠금 장치를 작동하는 메커니즘은 잠금 장치에 대한 액세스를 제어합니다.

모든 잠금 기본 요소는 프로세서 간에 변경 사항을 전달할 수 있어야 하므로 일반적으로 버스 작업(예: 메모리 읽기 및 쓰기) 위에 구현됩니다.또한 요청을 시도하는 두 스레드가 해당 상태를 손상시키지 않도록 구조화되어야 합니다.쉽지는 않지만 일반적으로 모든 OS 구현 잠금이 여러 스레드에 의해 손상되지 않을 것이라고 신뢰할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top