2012-07-26 3 views
0

현재 한 번에 약 20 개의 스레드로 실행되는 프로그램이 있습니다. 나는 멀티 스레딩에 상당히 익숙하지 않기 때문에 적절한 데이터 보호에 대해 다소 혼란스러워합니다.이벤트 또는 뮤텍스?

현재 내 스레드는 데이터를 잠금으로 설정하여 이벤트를 잠금 해제합니다. 대부분의 데이터가 2 ~ 3 개의 스레드 사이에서만 공유되므로 임계 섹션을 초과하여이 옵션을 사용하기로 결정했습니다. 따라서 하나의 스레드가 읽기를 방해하는 반면 20 개의 스레드를 모두 중지하면 쓰레기로 보입니다. 뮤텍스가 어떻게 작동하고 어떻게 구현하는지 명확하게 설명하는 소스를 (쉽게) 찾을 수 없다는 사실 때문에 뮤텍스 이벤트를 사용했습니다.

내 멀티 스레딩에 Win32 API를 사용하고 있습니다. 내 현재 설정에서는 데이터를 잠그기 위해 이벤트를 사용하여 내 이벤트가 "DataUnlock"과 유사 할 것입니다. 설정하지 않으면 데이터가 작동 중임을 알 수 있습니다. 설정된 경우 데이터를 처리하는 것이 좋습니다. 따라서 임시 변통 데이터 잠금은 이와 유사합니다.

WaitForSingleObject(DataUnlock,INFINITE); //Wait until the Data is free 
ResetEvent(DataUnlock);      //Signal that the data is being worked on 
...work on Data...  
SetEvent(DataUnlock);      //Signal that the data is free to use 

첫 번째 질문은 두 개의 스레드 만 데이터에 액세스 할 때 뮤텍스를 사용하는 것과 같은 좋은 (효율적인) 것입니까?

두 번째 : 데이터에 액세스하기 위해 대기하는 두 개 이상의 스레드가있을 경우 데이터가 해제 될 때 둘 다 트리거됩니다 (둘 다 ResetEvent에 도달하기 전에 대기 상태를 유지합니까)? 그렇다면 뮤텍스에 동일한 문제가 있습니까?

마지막으로 : 뮤텍스가 좋은 경우 어떻게 구현할 것인가? (링크 또는 설명이 크게 감사 할 것입니다.)

감사합니다.

답변

0

나는 이벤트 접근 방식이 데이터를 보호하는 최선의 방법이라고 생각하지 않습니다.

뮤텍스에 대해 알아 보려면 Mutex ObjectsUsing Mutex Objects을 확인하십시오.

  1. 스레드 중 하나가 뮤텍스를 만들어야합니다. CreateMutex function은 뮤텍스 개체에 대한 핸들을 반환합니다. 데이터를 처리하는 스레드에 핸들을 인수로 전달할 수 있습니다.
  2. WaitForSingleObject function을 사용하여 뮤텍스를 기다린 다음 데이터를 처리하십시오. ReleaseMutex function에 대한 호출로 뮤텍스를 해제하십시오. 뮤텍스가 해제되면 다음 대기 함수가 뮤텍스를 얻습니다.
  3. 데이터가 여러 프로세스의 스레드에 의해 액세스되는 경우 이름 지정된 뮤텍스가 사용되어야합니다.

중요 섹션 동기화에 대해 자세히 알아 보려면 Critical Section Objects을 확인하십시오.

당신이 중요한 부분이있는

  1. InitializeCriticalSection function의 호출에 의해 생성 될 필요가하십시오.
  2. 데이터를 처리하기 전에 모든 장소에서 EnterCriticalSection function을 사용하십시오.
  3. LeaveCriticalSection function은 중요한 섹션에서 개체를 해제합니다. 데이터를 다 마친 후에이 통화를 사용하십시오.

중요한 섹션은 소유 스레드에서만 입력 할 수 있습니다. 스레드가 중요 섹션 객체를 얻으면 다른 스레드가 데이터에 액세스 할 수 없습니다.다른 스레드는 EnterCriticalSection() 호출시 차단됩니다. 그러나 스레드가 중요한 섹션을 소유하면 EnterCriticalSection() 번으로 두 번 이상 호출 할 수 있습니다. 번에 대해 번으로 전화하면 LeaveCriticalSection() 번으로 전화하십시오. EnterCriticalSection()으로 전화하십시오.

이 예제에서는 이벤트를 기다리는 모든 스레드가 데이터를 처리하도록합니다. 그리고 당신은 anykind의 처리가 일어난 경우에만 데이터 자체로 알 것입니다. 그게 뭔지 결정하는 방법과 아직도해야 할 일을 결정하는 방법은 입니다. 이벤트를 기다리는 스레드가 많으면 get 액세스 순서를 알 수 없습니다.


중요한 섹션 개체를 사용하는 것이 좋습니다. 그것은 가볍고 비교적 사용하기 쉽습니다. 중요 섹션 개체를 사용하는 방법에 대한 예는 Using Critical Section Objects을 참조하십시오.