2010-02-07 4 views
1

문제에 대해 멀티 스레드 모듈을 설계해야합니다. 그리고 문제는, 내가 대기열을 가지고 메시지 대기열에 메시지를 넣고있는 하나의 스레드가 있고, 두 개의 스레드가 A와 B, 스레드 A가 짝수 메시지 (0,2,4 ..)와 스레드 B를 말하고있다 홀수 메시지 (1,3,5 ..)를 처리합니다. 두 가지 해결책을 생각해 냈습니다. 첫 번째는 두 개의 이벤트 (X와 Y)를 사용합니다. 이벤트 X는 스레드 A를위한 것이고 Y는 스레드 B를위한 것입니다. 메시지가 짝수 위치에 있는지 확인합니다. 스레드에 대한 이벤트 X를 설정합니다. 스레드 B의 경우 A와 Y입니다. 두 번째 해결 방법은 각 스레드에 대해 두 가지 별도의 탐색을 수행하는 것입니다. 스레드는 위치 메시지를 스레드 A의 대기열에 넣고 홀수 메시지는 스레드 B의 대기열에 넣습니다.이 솔루션 스레드 A와 B는 비동기 적으로 작동 할 수 있습니다. 맞습니까? 아니면 다른 멋진 해결책이 있습니까?멀티 스레드로 큐 메시지 처리

감사합니다.

+0

이상한 메시지와 짝수 메시지가 각각의 스레드에 의해 엄격하게 처리되어야한다는 요구 사항이 있습니까? 3, 4 또는 그 이상의 소비자 스레드를 쉽게 만들 수 있습니까? –

+0

엄격한 요구 사항이 아니어도 메시지는 그 방식으로 만 처리됩니다. – Reader

+0

소비자 스레드가 메시지의 짝수/홀수를 쿼리하도록 만들 수 없습니까? 그런 다음 적절한 방법으로 처리해야합니까? 가능한 경우 스레드 풀 패턴을 사용할 수 있습니다. –

답변

7

올바른 페칭 순서를 보장하기 위해 하나의 대기열 만 사용하고 A와 B를 동기화하는 것은 완전히 난센스입니다.

그냥 두 큐, A의 하나와 B에 대한 하나를 사용, 심지어 디자인 POV에서 훨씬 쉽고 cleanier 문제를 보인다 (그들은이 올바르게 작성되었는지 확인

+0

-1 OP가 나중에 4 개의 작업자 스레드를 사용하기로 결정하면 어떻게 될까요? 16 개의 스레드? 분명히 스레드 풀과 작업자 큐에 대해 들어 본 적이 없습니다. –

+1

요구 사항이 엄격한 스레드에 의한 메시지의 엄격한 처리라고 가정하면 별도의 대기열이 적합합니다. – Will

+0

@Will : 흠, 좋은 지적입니다. 나는이 문제를 명확히하기 위해 영업 비밀을 물어볼 것입니다. 나는 -1을 취소 할 수 있었으면 좋겠다. –

-1

우아한 솔루션 :.

  • 는 큐에 대해 하나의 잠금을 유지
  • 사용 세 세마포어 (각 스레드 하나)
    • WriteThreadSem
    • ,691

  • OddReadSem
  • EvenReadSem는 쓰기 스레드, 큐 잠금을 얻을 항목을 쓰기 잠금 ... 한편 짝수와 홀수 스레드는 해당 세마포어를 획득를 해제하게한다. 쓰기 스레드 쓰기가 끝나면 옆에있는 각 세마포를 통해 스레드가 깨어납니다. 깨우기 스레드는 대기열 잠금을 가져 와서 데이터를 읽습니다. 잠금을 해제하고 쓰기 쓰레드 세마포어를 활성화합니다. 쓰기 쓰레드는 쓰기가 필요한지 또는 다음 읽기 스레드가 깨울 필요가 있는지를 결정합니다.

    끝난.

  • +3

    Elegant? 이것은 엉망이다! – akappa

    +0

    멀티 쓰레딩 솔루션으로 할 수있는 최선의 방법은 ... 이미 다중 큐를 사용하기위한 옵션을 게시했습니다 ... –

    +0

    단일 큐를 사용하는 제약 조건이있는 경우이 방법이 유용 할 수 있지만 제약 조건을 발견했습니다 "이상한"(아마도 그런 이국적인 제약 조건에서 4 개의 자물쇠를 사치스럽게 사용할 여유가 없다). 그래서 나는 그런 변태의 요점을 볼 수 없다.) – akappa

    0

    thread pool 또는 작업 큐 매우 유사하다. 귀하의 경우에는 풀에 두 개의 작업자 스레드 만 있습니다. 나는 인텔 Thread Building Blocks 라이브러리가 스레드 풀을 지원한다고 생각한다.

    짝수/홀수 메시지가 각각의 스레드에서 엄격하게 처리되어야한다는 요구 사항이 없다고 가정 할 때 단일 스레드 안전 생성자/소비자 큐를 사용하고 두 소비자 스레드가 선착순/first-serve basis. 홀수 메시지를 스레드 A로, 심지어 메시지를 스레드 B로 제한 할 필요가 없습니다. 나중에 작업자 스레드 수를 늘리려면 선착순 솔루션이 더 쉽게 확장 될 수 있습니다 (예 : 4 개의 스레드가 실행될 수 있음). 쿼드 코어).