2016-10-16 3 views
0

다음은 시나리오입니다. 메인 스레드는 카운터를 업데이트 할 N 작업자 스레드를 생성합니다 (각 스레드가 처리하는 요청 수를 계산 중임).각 스레드에 의해 업데이트 된 전역 배열 저장 카운터. 필요시 카운터를 읽는 주 스레드?

총 카운터는 API 요청의 주 스레드가 읽어야합니다.

그래서처럼 설계의 생각 : 카운터의

1) 글로벌 해시 맵/배열/연결 목록을.

2) 각 작업자 스레드는 스레드 ID를 키로 사용하여이 글로벌 구조에 액세스하므로 하나의 작업자 스레드를 다른 스레드에서 보호하는 데 필요한 뮤텍스가 없습니다.

3) 그러나 어려운 부분은 다음과 같습니다. 온라인에서 찾을 수있는 예제가 없습니다. 메인 스레드가 요청시 모든 카운터 값을 읽고 요약하여 API 요청을 처리 할 수있게하려고합니다. 뮤텍스가 필요 하겠지?

전역 배열을 업데이트하기 전에 뮤텍스를 잠그는 작업자 스레드 뮤텍스가 필요합니다. 각 작업자 스레드가 주 스레드와 만 경쟁 할 경우 주 스레드가 제공 될 때만 뮤텍스가 실패합니다 API 요청

주 스레드 : API 요청을 받으면 작업 스레드 별 뮤텍스를 하나씩 잠그고 해당 스레드의 카운터를 읽고 총 개수를 가져와야합니다.

내가 이것을 과장 시켰습니까? 나는이 설계에서 per-worker-thread 뮤텍스를 요구하지 않는다.

입력 해 주셔서 감사합니다.

+0

뮤텍스 _ 네가 _ 네가됩니다. –

+0

아무 것도 지나치게 복잡하지 않습니다. 적절한 다중 스레드 설계는 복잡합니다. –

답변

0

디자인이 올바른 접근 방식으로 들립니다. 그것들을 쓰레드 단위의 뮤텍스라고 생각하지 마라. 그것들을 카운터 단위 뮤텍스라고 생각하면된다. (배열의 각 원소는 뮤텍스/카운터 쌍이어야한다.)

메인 스레드에서 모든 뮤텍스를 잠근 다음 모든 카운터를 읽을 필요가 없습니다. 값이 무언가라면 순서대로 각 카운터에 대해 잠금/읽기/잠금 해제를 수행 할 수 있습니다 (모든 스레드가 처리하는 요청 수)와 같이 모든 카운터를 함께 읽는 것이 순차적으로 읽는 것보다 "더 정확한"대답을주지는 않습니다.

또는 언어/환경에서 제공하는 경우 자물쇠 대신 카운터에 원자 변수를 사용할 수 있습니다.

0

실행 횟수를 유지하려면 std::atomic<int>을 사용하면됩니다. 스레드가 카운터를 갱신하면 실행중인 계수도 갱신됩니다. 메인 쓰레드가 카운트를 필요로 할 때 그것은 실행 카운트를 읽는다. 결과는 주어진 순간의 실제 총계보다 적을 수 있지만, 상황이 안정 될 때마다 총계가 옳습니다.

관련 문제