2012-05-21 2 views
3

중요한 섹션이있는 경우이를 잠그는 방법을 구현해야합니다. 나는 다음과 같은 변형 보았다 : 여러 스레드가 while(lock)이 (확인하고는 = 거짓 볼)과 함께 임계 영역에 들어갈 수행 할 수 있습니다, 내가 있기 때문에 이론적으로 그것에 대해 의심 해요,하지만잠금을위한 폴링이 중요한 섹션을 구현하는 올바른 방법입니까?

while(lock) 
{ 
    //do nothing 
} 
lock = true; 
// code of critical section 
lock = false; 

while(lock)lock = true; 때문에 하나의 연속적인 블록에서 수행되는 것이 아닙니다. 내가 잘못? 또는 이것은 실제로 안전하지 않은 방법입니까?

+0

자물쇠가 필요하므로 자물쇠를 사용하십시오. –

답변

3

"거의 안전합니다"즉 전혀 안전하지 않습니다. 부족한 부분은 정확히보고있는 것입니다. 여러 스레드가 lock == false을보고 중요한 섹션을 입력 할 수 있습니다. 그것은 하나의 실행 스레드 만이 잠금을 획득 할 수 있도록하기 위해 하드웨어가 지원해야하는 원자 적 연산이 필요합니다.

당신이 쓰고있는 시스템이 상호 배타적 인 실패에서도 살아남을 수 있으며 가끔 실패로 인해 정상적으로 작동 할 수 있다면 (아마도 로깅되거나 가끔 엉망인 항목으로 인해 전체 오류가 발생하지는 않을 것입니다),이 패턴 "일종의"일을 할 수 있습니다 ...

+0

"이것은 원자 연산이 필요합니다. 이것은 하드웨어에서 지원해야합니다"- 이것은 어셈블리 코드의 명령어 여야합니까? 아니면이를위한 준비 메커니즘이 있습니까? –

+1

이것은 CPU의 명령어 세트에있는 명령어 (또는 여러 명령어 중 하나)입니다. 컴파일러가 이러한 구문을 지원할 경우 원시 어셈블리 코드 나 인라인 어셈블리 코드를 통해 액세스 할 수 있습니다. 이미 올바른 루틴이 작성된 스레딩/동시성 라이브러리를 활용하는 것이 좋지만, gcc 나 Windows와 VC++ 또는 기타 다른 언어를 사용하는지 여부는 언급하지 않았습니다. – twalberg

+0

감사합니다. Embarcadero RAD Studio C++ Builder 2010을 사용하고 있습니다. –

5

정확합니다. 안전하지 않습니다. 그 이상은 말할 것도 없습니다.

편집 : 아니요, 정말로이 구성에 대해 말할 필요가 없습니다. 이것은 이 아니고 스핀 록이 아니며 스핀 록과 거의 같습니다. 스핀 락의 경우,이 같은 막연하게 뭔가가 필요합니다

// note: incomplete, not reentrant, not intended for real use 
atomic_type spin_lock = 0; 

// enter the spin lock: 
int prev_value; 

while ((prev_value = test_and_set(&spin_lock, 1)) != 0 || spin_lock != 1) 
    ; 
// code of critical section 

// release the spin lock: 
test_and_set(&spin_lock, 0); 

여기서 중요한 점은 스핀 잠금을 입력하는 즉를, 당신은 이전 값을 얻기 위해 필요 원자 새로운 값 을 설정합니다. 그런 다음 자물쇠에 쓰는 것이 '소유하지 않음'에서 '소유'상태로 변경되었는지 확인해야합니다.

+0

당신도 맞습니다,하지만 첫 번째 문장 만합니다. 더 말할 것이 많습니다. –

+0

@JensGustedt : 스레드 안전 프로그래밍 (및 그와 같은)에 대해서는 말할 것도 없지만,이 특정 구성에 대해서는 말할 것도 없습니다. –

0

구현하려는 것은 스핀 록이라고합니다. 새로운 C 표준 인 C11은 이와 같이 사용할 수있는 atomic_flag이라는 원시 데이터 유형을 구현합니다. 거의 모든 현대의 하드웨어가이를 지원하지만, 불행하게도 대부분의 컴파일러는 구문상의 레벨에서이를 지원할 수있는 정확한 위치가 아니라 자체적 인 확장 기능을 가지고 있습니다. 예를 들어 gcc에는 __sync_lock_test_and_set__sync_lock_release이 내장되어 있습니다.

+0

이것은 스핀 잠금이 아니며 스핀 록과 거의 유사하지 않습니다. –