지금은 다중 스레드 동기화를 실험하고 있습니다. backround의 경우 약 100,000 개의 객체 집합이 있습니다. 아마도 더 많은 것입니다. 초당 여러 번 다른 방식으로 처리하려고합니다.이벤트를 통한 스레드 동기화의 오버 헤드
이제 나와 관련된 것은 동기화의 성능입니다.
이것이 제대로 작동해야한다고 생각합니다 (모든 보안 측면이 생략되었으므로 테스트 프로그램 일 뿐이며 오류가 발생하면 프로그램이 중단됩니다 ..). 나는 두 개의 펑션을 썼다. 첫 번째는 프로그램의 주 스레드에 의해 실행되었고 두 번째는 모든 추가 스레드에 의해 실행되었다. 8 개 논리적 코어 12500 개체 각, 현대 멀티 코어 프로세서의 8 개 부분 집합으로 분할, 우리는 위에서 100000 개 객체를 가지고 말 :
void SharedWorker::Start()
{
while (bRunning)
{
// Send the command to start task1
SetEvent(hTask1Event);
// Do task1 (on a subset of all objects) here
// Wait for all workers to finish task1
WaitForMultipleObjects(<NumberOfWorkers>, <ListOfTask1WorkerEvents>, TRUE, INFINITE);
// Reset the command for task1
ResetEvent(hTask1Event);
// Send the command to start task2
SetEvent(hTask2Event);
// Do task2 (on a subset of all objects) here
// Wait for all workers to finish task2
WaitForMultipleObjects(<NumberOfWorkers>, <ListOfTask2WorkerEvents>, TRUE, INFINITE);
// Reset the command for task2
ResetEvent(hTask2Event);
// Send the command to do cleanup
SetEvent(hCleanupEvent);
// Do some (on a subset of all objects) cleanup
// Wait for all workers to finish cleanup
WaitForMultipleObjects(<NumberOfWorkers>, <ListOfCleanupWorkerEvents>, TRUE, INFINITE);
// Reset the command for cleanup
ResetEvent(hCleanupEvent);
}
}
DWORD WINAPI WorkerThreads(LPVOID lpParameter)
{
while (bRunning)
{
WaitForSingleObject(hTask1Event, INFINITE);
// Unset finished cleanup
ResetEvent(hCleanedUp);
// Do task1 (on a subset of all objects) here
// Signal finished task1
SetEvent(hTask1);
WaitForSingleObject(hTask2Event, INFINITE);
// Reset task1 event
ResetEvent(hTask1);
// Do task2 (on a subset of all objects) here
// Signal finished task2
SetEvent(hTask2);
WaitForSingleObject(hCleanupEvent, INFINITE);
// Reset update event
ResetEvent(hTask2);
// Do cleanup (on a subset of all objects) here
// Signal finished cleanup
SetEvent(hCleanedUp);
}
return 0;
}
난 그냥 당신에게 약간의 예를 들어 줄거야, 내 요구 사항을 지적하려면 . 관련 부분은 시간입니다. 모든 작업은 약 8ms 이내에 수행되어야합니다.
지금 내 질문이 있습니다. 분할 처리로 시간이 크게 늘리거나 너무 비싼 이벤트를 통한 동기화가 가능합니까? 또는 모든 작업을 이런 방식으로 수행해야하는 경우 스레드를 적은 노력 또는 프로세스 시간으로 동기화하는 다른 방법이 있습니까?
그것은 당신의 작업에 대한 자세한 내용을 모르고 대답하는 것은 불가능하고, 자신의 자원 요구 사항 (CPU, I/O) :
그래서 의사 코드는 다음과 같다 할 수 있습니다. 일반적으로 대기 상태에서 스레드가 소비 한 시간을 최소화해야합니다. 비동기 처리는 스레드 간 신호 전달의 한 가지 대안이지만 작업 실행에는 불가능할 수도 있습니다. –아, 죄송합니다. 리소스 요구 사항을 완전히 잊어 버렸습니다. 작업 1과 2는 순수한 CPU이며, 정리 2는 작업 2의 개체를 지연 삭제할 때만 사용됩니다. 비동기 처리는 task1, task2 및 정리가 순서를 유지해야하는 고정 된 순서이므로 불행히도 대안이 아닙니다. 다음 작업을 완료해야합니다. 하나 시작할 수 있습니다. – rootmenu
자신의 스레딩/시그널링을 사용하는 대신 OpenMP와 같은 것을 사용할 수있는 것 같습니다. 비슷한 순서의 작업을 병렬로 실행하는 데 적합합니다. http://msdn.microsoft.com/en-us/library/tt15eb9t(v=vs.110).aspx –