2011-09-21 4 views
1

는 스레드에 의해 startet입니다 약간의 계산 방법을 가지고 상상해보십시오. 그들은 명의 동시 호출 할 수 있지만, 때 알 수 없습니다을 막기 두 번

void MyClass::Process { 
    boost::thread t1(&MyClass::DoSomething, this); 
    // go on ... 
} 

void MyClass::Foo { 
    boost::thread t2(&MyClass::DoSomething, this); 
    // and something more ... 
} 

어떻게 모든 실행에 beeing에서 t2을 방지하기 위해 t1가 실행중인 경우,? 내 unique_lock이 실패한 것으로 보입니다.

+0

어떻게이 "실패"않습니다 Naszta의 아이디어를 바탕으로

Check this example.

+0

@Kerrek't2'에 대해서도 잠금을 얻을 수 있습니다. – Benjamin

답변

2

변수를 만들고 t1 스레드를 시작하기 전에 해당 변수를 원자 단위로 늘리십시오. 작업이 끝나면 변수를 원자 적으로 null로 감소시킵니다. Foo에서이 변수가 null인지 아닌지 만 확인하면됩니다.

std::atomic<bool> thread_in_use(False); 

void DoSomething() 
{ 
    if (thread_in_use.exchange(true)) 
    return; 

    // ... 

    thread_in_use = false; 
} 
+0

이것은 해결책 일지 모르지만, 늘리거나 줄이거 나 점검하지 않고 방법을 찾아 내려고했습니다. 때로는 사람이 단순히 이것을 잊을 수 있기 때문에 :) – Benjamin

+1

@ 벤자민 : 그것은 뮤텍스보다 효과적이며, 또한 무엇을 잠그고 잠금 해제해야합니다. – Naszta

2

, 여기 원자 bools 및 원자 스왑을 사용하여 가능한 방법입니까?