문제

저는 pthread를 사용하여 다중 스레드 C 응용 프로그램을 작업 중입니다.데이터베이스에 쓰는 하나의 스레드(데이터베이스 라이브러리는 단일 스레드에서만 사용하기에 안전함)와 데이터를 수집하고 처리한 다음 저장을 위해 결과를 데이터베이스 스레드로 보내야 하는 여러 스레드가 있습니다.나는 C에서 다중 작성자 안전 대기열을 만드는 것이 "가능"하다고 언급한 것을 보았지만 이것이 언급된 모든 곳에서는 단순히 "이 예에서는 너무 복잡하다"고 말하고 단일 작성자 안전 대기열을 보여줄 뿐입니다. .

다음 사항이 필요합니다.

  • 효율적인 삽입 및 제거.다른 대기열과 마찬가지로 O(1) 대기열 추가 및 대기열 제거가 가능하다고 가정합니다.
  • 동적으로 할당된 메모리, 즉연결된 구조.대기열 크기에 임의의 제한을 둘 필요가 없으므로 배열은 실제로 내가 찾고 있는 것이 아닙니다.

편집하다: 읽기 스레드는 빈 대기열에서 회전해서는 안 됩니다. 왜냐하면 쓰기가 없고 짧은 쓰기 횟수가 급증하면서 몇 분 동안의 시간이 있을 수 있기 때문입니다.

도움이 되었습니까?

해결책

물론, 잠금식 대기열이 있습니다. 그래도 댓글에서 말한 내용을 바탕으로, 성능은 어쨌든 쓰기 당 스레드를 만들기 때문에 전혀 중요하지 않습니다.

따라서 이것은 조건 변수의 표준 사용 사례입니다. 뮤텍스, 조건 변수, 링크 된 목록 (또는 원하는 경우 원형 버퍼) 및 취소 플래그가 포함 된 구조물로 만듭니다.

write:
    lock the mutex
    (optionally - check the cancel flag to prevent leaks of stuff on the list)
    add the event to the list
    signal the condition variable
    unlock the mutex

read:
   lock the mutex
   while (list is empty AND cancel is false):
       wait on the condition variable with the mutex
   if cancel is false:  // or "if list non-empty", depending on cancel semantics
       remove an event from the list
   unlock the mutex
   return event if we have one, else NULL meaning "cancelled"

cancel:
   lock the mutex
   set the cancel flag
   (optionally - dispose of anything on the list, since the reader will quit)
   signal the condition variable
   unlock the mutex

외부 노드가있는 목록을 사용하는 경우 뮤 테스 잠금 외부의 메모리를 할당하여 유지 시간을 줄일 수 있습니다. 그러나 방해가되는 목록 노드로 이벤트를 설계하면 아마도 가장 쉬운 일입니다.

편집 : 취소 중에 "신호"를 "방송"으로 변경하면 여러 독자 (주어진 이벤트를받는 휴대용 보증이 없음)를 지원할 수도 있습니다. 필요하지는 않지만 실제로 비용이 들지 않습니다.

다른 팁

잠금 해제 대기열이 필요하지 않은 경우 기존 대기열을 잠금으로 마무리할 수 있습니다.

Mutex myQueueLock;
Queue myQueue; 
void mtQueuePush(int value)
{
    lock(myQueueLock);
    queuePush(myQueue, value);
    unlock(myQueueLock);
}
int mtQueueNext()
{
    lock(myQueueLock);
    int value = queueFront(myQueue);
    queuePop(myQueue);
    unlock(myQueueLock);
    return value;
}

그 이후의 유일한 작업은 대기열이 비어 있을 때 mtQueueNext에 대한 일종의 처리를 추가하는 것입니다.

편집하다:단일 판독기, 단일 기록기 잠금 없는 대기열이 있는 경우 여러 동시 기록기를 방지하려면 mtQueuePush 주위에 잠금만 설정하면 됩니다.

단일 판독기/작성기 잠금 없는 대기열이 많이 있지만 대부분은 C++ 템플릿 클래스로 구현됩니다.그러나 Google 검색을 수행하고 필요한 경우 일반 C로 다시 작성하는 방법을 알아보세요.

http://www.liblfds.org

C.로 작성된 잠금 장치 데이터 구조 라이브러리

M & S 대기열이 있습니다.

나는 여러 개의 싱글 작가 대기열 (작가 스레드 당 하나)을 사용합니다. 그런 다음 확인할 수 있습니다 이것 단일 독자가 다양한 대기열을 읽게하는 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top