2017-10-17 1 views
2

뮤텍스 잠금은 스레드에 호출 된 순서대로 제공됩니까? 그래서 우리는 세 개의 쓰레드 A, B, C와 mutex mtx를 가지고 있다고 가정하자. A가 mtx.lock()을 먼저 호출 한 다음 B와 C를 호출하면 A가 먼저 잠금을 얻고 B와 C를 차례로 수행한다는 것을 의미합니까? 그렇지 않으면 어떻게 보증 할 수 있습니까?뮤텍스 잠금 순서

+2

이것은 진짜 질문입니다. [mcve]는 그것을 _good_ 질문으로 바꿀 것입니다. (참고 : 나는 OP가 쓰레드 A와 실제로 쓰레드가 B와 C를 통해 잠금 명령이된다는 사실을 알고있다.) – YSC

+0

"A"는 먼저 잠금을 얻지 만 " B "와"C " – AhmadWabbi

+0

B와 C의 순서를 시행 할 방법이 있습니까? – Rishi

답변

1

뮤텍스에서 둘 이상의 스레드가 대기 중이면 대기중인 스레드가 선택됩니다. 선입 선출 (FIFO) 주문을 가정하지 마십시오. 커널 모드 APC와 같은 외부 이벤트로 인해 대기 명령이 변경 될 수 있습니다. - MSDN에서 Mutex 객체에 관한 페이지.

참조 링크 :이 설명하는 간단한 예제를 가지고 Mutex Objects

+0

이 경우 주문을 보증하기 위해 무엇을 사용할 수 있습니까? – Rishi

+0

해당 링크는 플랫폼 별 뮤텍스 API에 대한 것 같습니다. 그러나 asker가 표준 C++ (즉,'std :: mutex') 이외의 것을 사용하고 있다는 표시는 없습니다. –

+0

현재 소유자가 뮤텍스를 잠금 해제 할 때 어떤 스레드가 뮤텍스의 소유권을 받을지 명시하지 않았습니다 (std :: mutex 의미) –

0

, 내가 가입 대기 완료 후 잠금 장치, 인쇄 뭔가를 취득하고 3 개 작업을 만듭니다. 장벽 (3)을 설정하는 대신 (2)로 설정할 수 있으며 task_a를 실행하고 다른 두 사람이 자물쇠를 뒤집어 뛸 수 있습니다.

나는 boost :: barrier를 사용하여 생성되는 즉시 시작하지 않도록합니다. 결과는 FIFO가 아닌 비 결정적 순서입니다. 다른 플랫폼을 사용하면 다른 결과를 얻을 수 있습니다. A demo of it in action

std::mutex foo; 
boost::barrier bar(3); 

void task_a() { 
    bar.wait(); 
    foo.lock(); 
    std::cout << "task a\n"; 
    foo.unlock(); 
} 

void task_b() { 
    bar.wait(); 
    foo.lock(); 
    std::cout << "task b\n"; 
    foo.unlock(); 
} 

void task_c() { 
    bar.wait(); 
    foo.lock(); 
    std::cout << "task c\n"; 
    foo.unlock(); 
} 

int main() 
{ 
    std::thread th1 (task_a); 
    std::thread th2 (task_b); 
    std::thread th3 (task_c); 
    th1.join(); 
    th2.join(); 
    th3.join(); 

    return 0; 
} 
+0

감사합니다. 위의 코드에서 FIFO 순서를 어떻게 보장하겠습니까? – Rishi

+0

조건 변수를 사용할 수 있습니다. 조건 변수는 한 스레드가 완료되면 다른 스레드가 진행할 신호를 보내고 세 번째 스레드는 계속 진행합니다. –

+0

조건 변수가 순서를 보장하지 않는다고 생각 하나? 또는 특정 방식으로 내 코드를 구현해야합니까? 그래서 th2와 th3 쓰레드는 모두 조건 변수를 사용하여 th1을 기다린다. th2는 다음 실행이 보장 될 것이다 – Rishi

관련 문제