2012-07-02 5 views
3

작업 항목의 큐를 처리하는 작업자 스레드가 있습니다. 작업 항목이 현재 처리 가능하지 않을 수 있으므로 작업자 스레드가 다시 작업 항목을 대기열로 밀어 넣을 수 있습니다.서로 다른 두 조건에서 pthread 동기화

void* workerFunc(void* arg) { 
    WorkItem* item = NULL; 

    while(true) { 
     { 
      scoped_lock(&queueMutex); 
      while(workerRunning && workQueue.empty()) 
       pthread_cond_wait(&queueCondition, &queueMutex); 
      if(!workerRunning) 
       break; 

      item = workQueue.front(); 
      workQueue.pop(); 
     } 

     // process item, may take a while (therefore no lock here), 
     // may also be considered unprocessable 

     if(unprocessable) { 
      scoped_lock(&queueMutex); 
      workQueue.push(item); 
     } 
    } 
    return NULL; 
} 

지금 내가해야 할 다음과 같은 : 때때로, 나는 (작업 항목을 큐에 넣 동일한 스레드에서) 더 이상 필요하지 않은 항목을 제거하는 작업 큐를 스캔 할 필요가있다. 현재 처리중인 항목을 놓칠 수도 있기 때문에 queueMutex를 사용할 수 없습니다. 모든 처리되지 않은 항목이 실제로 대기열에있는 지점에서 전체 처리 스레드를 일시 중지 할 방법이 필요합니다. while 루프).

다른 mutex 및 조건부 변수와 함께 두 번째 bool 변수 ("일시 중지됨")에 대해 생각했지만 worker가 queueCondition에서 신호를 기다리는 특별한 경우를 처리해야합니다. 실제로 pthread_cond_wait() 호출은 두 뮤텍스를 잠금 해제/잠금해야합니다.

나는이 문제에 대한 간단한 해결책이 있어야한다고 생각하지만, 그 문제를 해결할 수없는 것처럼 보입니다. 여러분 중 일부가 나를 도울 수 있기를 바랍니다.

미리 감사드립니다.

+1

생산자 (항목을 삽입하는 스레드)가 큐에서 불필요한 항목을 제거한다면 - 같은 뮤텍스 ('queueMutex')를 그대로 가져야합니다 대기열을 수정합니다. 프로세서 스레드가 항목을 대기열에서 꺼내어 작업 중이면 아무 문제가 없습니다. 처리되지 않은 경우 다음 번에 생산자가 불필요한 항목을 대기열에서 검색 할 때 해당 항목을 선택합니다. – Nim

+0

대기열이 비어있는 동안 조건이 대기하는 이유는 무엇입니까? – jxh

+1

오, 그건 오타입니다. 나는 고칠 것입니다. 죄송합니다. – Pontomedon

답변

4

기본적으로 POSAPI에서 WinAPI의 WaitForMultipleObjects() 호출을 에뮬레이션해야합니다. POSIX에는 WinAPI처럼 모든 유형의 이벤트/개체를 기다리는 단일 API가 없습니다.

pthread_cond_timedwaitclock_gettime을 사용하십시오. 구현 세부 사항은이 문서 WaitFor API을 참조하십시오.

문제를 해결할 수있는 몇 가지 흥미로운 코드가 있습니다 (답변에 게시하기에는 너무 많지만 유용합니다).

P. 토론을 위해이 질문을 참조하십시오 : WaitForSingleObject and WaitForMultipleObjects equivalent in linux

+1

고마워요, 그걸 시도 할게요 – Pontomedon

+0

당신은 천만에요. 그래서 대답을 할 :) –

관련 문제