2017-11-10 9 views
0

2 개의 프로세스가 있습니다. 첫 번째 작업은 다른 작업으로 일부 데이터를 보내고 각 작업을 동기화합니다. 는 실제로 다음과 같은 데이터를 전송 :뮤텍스가 C++을 동기화하지 않습니다

Process : A sends 1 
Process : B receives 1 
Process : A sends 2 
Process : B receives 2 

문제는 그 나는 처음부터 모든 데이터를 전송하는 프로세스 A를 실행하고 나는 무언가 같이 볼 때 : 나는대로했다

Process : A sends 1 
Process : A sends 2 
Process : A sends 3 
Process : B receives 3 

다음

Process A 
    HANDLE mutex;  
    mutex = CreateMutex(NULL, FALSE, TEXT("mutex1")); 
    if (mutex == INVALID_HANDLE_VALUE) { 
     _tprintf(TEXT("Create mutex error !.\n"), GetLastError()); 
     return 1; 
    } 
    for (int i = 0; i < sender_length;i++) { 
     WaitForSingleObject(mutex,INFINITE); 
     sendToB(data); 
     ReleaseMutex(mutex); 
     } 

    CloseHandle(mutex); 

그리고 B 과정은 다음과 같습니다 :

Process B: 

    HANDLE mutex; 

    mutex = OpenMutex(SYNCHRONIZE, FALSE, TEXT("mutex1")); 

    if (mutex == INVALID_HANDLE_VALUE) { 
     _tprintf(TEXT("Mutex error ! \n"), GetLastError()); 
     return 1; 
     } 
    for (int i = 0; i < sender_length;i++) { 
      WaitForSingleObject(mutex,INFINITE); 
      receiveFromA(data); 
      ReleaseMutex(mutex); 
      } 

     CloseHandle(mutex); 
+1

동기화하려는 코드 안에 뮤텍스를 만들지 마십시오. –

+5

뮤텍스의 정신 모형에 오류가있는 것 같습니다. 뮤텍스가 당신이 생각하는 것처럼 보이지 않는다고 말하는 것 이외에는 대답 할 수없는 질문은 여기에 있습니다. –

+5

뮤텍스는 한 번에 하나만 저장할 수 있다고 말합니다. 다양한 참가자가 그것을 습득하는 순서에 대해서는 아무 것도 말하지 않습니다. 당신이 묘사 한 것은 이것의 완벽하게 유효한 결과입니다. 아마 어떤 종류의 대기열을 원할 것입니다. – GManNickG

답변

1

나는 이것이 당신의 문제인지는 모르겠지만 적어도 기여자가 될 가능성이 높다고 생각합니다. Windows 잠금은 당분간 공정하지 않았습니다. Joe Duffy의 기사 Anti-convoy locks in Windows Server 2003 SP1 and Windows Vista을 참조하십시오. 물론

, 윈도우 잠금 여전히 훑어 비트 공정한 : 뮤텍스를 위해 특별히

는 더피는 (나 추가 하이라이팅) 다음을 말한다. 상호 h 타적 잠금에 대한 대기리스트는 FIFO 순서로 유지되며, OS는 항상 대기 대기 행렬의 앞쪽에서 스레드를 깨 웁니다. ... 이제 잠금이 소유되지 않을 때 FIFO 깨우기 알고리즘이 계속 사용되지만 잠금은 즉시 사용할 수없는 것으로 표시됩니다. 또 다른 스레드가 몰래하고 깨우지 스레드가 심지어는 다른 스레드가 바로 잠금을 해제 스레드 할 수

을 계획하기 전에 잠금을 취할 수 있습니다. 귀하의 코드에서, 뮤텍스를 해제하는 스레드는 뮤텍스를 다시 획득하기 위해 attempt를 수행합니다. 이것은 좋은 위치에 있습니다.

+2

공정한 잠금을 사용하더라도 예상되는 결과가 보장되지 않거나 특히 그렇다고 볼 수는 없습니다. 완벽한 핑퐁을 앞뒤로 잡기 위해서는 양방향으로 명시적인 동기화가 필요합니다. 일반적으로 파이프를 작성하는 경우 버퍼링이 어느 정도 제공되지만 대기를 수행하려면 뮤텍스 이상이 필요합니다. –

+0

두 프로세스에 연결된 디버거를 사용하면 "핑퐁"시퀀스를 강제로 수행함으로써이 가설을 확인할 수 있습니다. –

+0

WaitForSingleObject 모두에 중단 점 설정 –