2010-01-19 5 views
5

하나의 리더와 하나의 작성자 만있는 경우 뮤텍스가 필요합니까? 판독기는 대기열에서 다음 명령 (food.front())을 취하고 명령을 기반으로 작업을 실행합니다. 명령이 실행 된 후 명령이 실행됩니다. 대기열에있는 작성자는 대기열 (food.push())에 명령을 푸시합니다.뮤텍스 또는 뮤텍스하지 않으려면?

뮤텍스가 필요합니까? 내 독자 (소비자)는 food.size() > 0 인 경우에만 실행됩니다. 독자 스레드를 사용하고 스레드를 보내고 있습니다.

+1

위의 컨테이너 중 어느 컨테이너를 사용하고 있습니까? –

+0

@Timo :'queue food;' –

답변

10

뮤텍스는 멀티 스레드 환경에서 사용됩니다. 질문에 스레드에 대한 언급이 없으므로 뮤텍스가 필요하지 않습니다. 우리는 리더와 당신이 두 개의 스레드를 의미하는 작가로 가정하면

그러나, 당신은 뮤텍스와의 상호 데이터를 보호해야합니다 (또는 다른 멀티 스레드 보호 방식.)

큐 항목이있는 경우 어떻게됩니까

, 그리고 작가 스레드 뭔가를 박았 동안 독자 스레드가 뭔가를 팝? 재앙! 뮤텍스를 사용하면 한 번에 하나의 스레드 만 대기열에서 작동하고 있는지 확인할 수 있습니다.

또 다른 방법으로는 잠금이없는 스레드 안전 큐가 있습니다. 데이터가 잘못 조작되지 않도록 원자 연산을 사용합니다.

+0

질문에 'multithreading'이라는 태그가 붙어 있습니다. –

+1

@ 존 : 아, 보통 태그를 관찰하지 않습니다. – GManNickG

+0

@GManNickG : "lock-free thread-safe queue"는 무엇을 의미합니까? 내 생필품에 따라 건축 한 것? 아니면 STL에 그런 것이 있습니까? – steffen

1

독자가 크기가 0보다 큰 것으로 보이지만 구조가 아직 완전히 업데이트되지 않은 경우 어떻게됩니까?

업데이트를 매우 신중하게 코딩하면 피할 수 있지만 나중에 을 변조하지 않도록 코드를 내버려 두는 방법은 뮤텍스를 사용하는 것입니다. 은 "작가"과 "독자"가정

+1

멀티 프로세서/멀티 코어 아키텍처에서의 실행에 대해 "매우 신중하게 업데이트를 코딩하는"것은 올바른 메모리 장벽을 사용하는 것을 의미합니다 올바른 장소에서 두통입니다. –

1

별도의 스레드에 있습니다

대부분의 아마 예 : 당신은 "쓰기"이벤트와 "읽기"이벤트 사이에 "준 안정"상태를 가질 수 포인터 구조에 일관성이있다.

물론 이것은 구현에 따라 다릅니다. 원자 작업이 포인터를 업데이트하는 데 사용되면 뮤텍스가 없으면 좋을 것입니다.

1

완전히 다른 변수에 액세스하는 두 개의 다른 스레드가있는 경우 구현에 따라 뮤텍스가 필요합니다. 그렇지 않으면 예를 들어 일치하지 않는 카운트로 끝날 수 있습니다.

당신이 ++ 카운트를하고 당신이 읽을 때 - 현재의 값이 2라고 말하면,이 문장은 원자적일 필요는 없습니다. ++ 카운트는 변수 카운트를 읽는 것으로 구성 될 수 있습니다 그것을 증가시킨 다음 다시 쓰는 것입니다. 쓰기와 읽기가 동시에 수행되지 않고 쓰기의 첫 번째 비트가 실행되었다고합니다 (즉, 값 2를로드하면 전체 읽기가 카운트를 감소 시키지만 다른 스레드는 여전히 값 2가로드 된 상태로 증가합니다). 그 후 변수에 다시 기록 이제 그냥 읽기 동작을 잃은

0

귀하의 질문에 두 가지 조건에 따라 달라집니다..

  1. 한 제조자이다, 다른 하나는 소비자
  2. 두 개의 스레드가있다 구조는 자물쇠가없는 것을 위해 디자인된다

두 가지 모두를 만족하는 경우 잠금을 삭제하거나 잠금을 사용하여 대기열 구조를 보호해야합니다.
잠금을 해제하려면 단계의 끝에 헤더 또는 테어 포인터를 업데이트해야합니다.