2012-09-09 3 views
7

이 코드는 스레드 안전합니까? 함수 sig에 휘발성이 있어야합니까? (예 : void Unlock() volatile {v=0;})이 스레드 세이프를 만드는 방법이 아닌 경우? 성공할 때까지 루프에서 CAS를 호출하지 않기 때문에 당신이 TryLockLock의 이름을 바꿀 수 있지만이 간단한 (원자) 잠금 스레드가 안전합니까?

class SimpleLock { 
    std::atomic<int> v; 
public: 
    bool try_lock() { int z=0; return v.compare_exchange_strong(z, 1); } 
    void lock() { while(try_lock()==false) std::this_thread::yield(); } 
    void unlock() {v=0;} 
}; 
+0

이 코드는 장난감 코드이므로 실제 응용 프로그램에서 사용해서는 안됩니다. 적절한 잠금 장치에 비해 성능이 심각합니다. (단지 하나의 예로서, 양보 할 다른 스레드가없고'lock '을 호출하는 스레드가 잠금을 보유하고있는 스레드와 동일한 물리적 코어에서 실행 중인지 상상해보십시오.) 아! –

답변

8

예, 그것은 스레드 안전합니다. 전통적으로 Lock 작업은 획득이 성공할 때까지 차단되어야합니다. volatile 대해서는

, std::atomicthe docs합니다 (= 연산자에 대해) 지정

원자는 원자 변수 t의 값을 할당한다. 상점과 동일합니다 (원하는 경우).

을 약 store :

공극 저장소 (T는 memory_order = 표준 : memory_order_seq_cst 원하는); 그런 다음에 대한 memory_order = std::memory_order_seq_cst

: 아니오 작가 스레드의 글을

  • 독자 스레드에서
  • 없음 읽기 원자 저장 한 후 다시 정렬 할 수 있습니다

    는 원자로드하기 전에 다시 정렬 할 수 있습니다.
  • 동기화는 std :: memory_order_seq_cst 태그가 붙은 모든 원자 작업간에 설정됩니다. 그러한 원자를 사용하는 모든 쓰레드는 동일한 메모리 액세스 순서를 보게된다.

아니요, 여기서는 volatile이 필요하지 않습니다. , 실행 스레드 내에서

하지 보장하는 모든 휘발성 개체에 액세스 (읽기 및 쓰기) : 또한, volatile는 약한 위의 것보다 보장 (사실, volatile가 C에 대부분 쓸모를 ++)이있다 휘발성 액세스는 스레드 간 동기화를 확립하지 않으므로 다른 기타와 관련하여 재 순서화됩니다. 그러나이 순서는 다른 스레드에서 관찰되는 것이 보장되지 않습니다.

+0

맞음. 이제는 'bool TryLock() volatile'이어야하는지, 아니면 생각하지 않아도 될까요? –

+0

이 라이브러리를 표준 라이브러리와 함께 사용하고자한다면'bool try_lock()'과'void unlock()'을 호출하는 것이 더 좋습니다. – kennytm

+0

@ acidzombie24 : 편집을 참조하십시오. – Tudor

관련 문제