win32 API 만 사용하여 동일한 스레드 proc를 실행하는 여러 작업자 스레드를 제어하는 가장 좋은 방법은 무엇입니까?Windows에서 작업자 스레드를 제어하는 모범 사례 (기본)?
많은 대안을 시도했지만 올바른 결과를 얻을 수 없습니다. 내 현재 코드는 다음과 같은 : 기본적으로 나는 여러 작업 스레드를 걷어차 시작하지만 예상대로 물론이 작동하지 않는 이벤트를 사용하고
// thread proc
DWORD WINAPI thread_proc(LPVOID param) {
while(1) {
WaitForSingleObject(start_event, INFINITE);
// Do some work HERE
// Work finished, go back to waiting for new work
}
}
// main proc
int main(void) {
// create enough worker threads
CreateThread(... thread_proc...);
CreateThread(... thread_proc...);
...
// Wait for work here
// start work by raising event
SetEvent(start_event);
ResetEvent(start_event);
. 주 스레드가 SetEvent() 및 ResetEvent() 사이에서 인터럽트되면 작업자 스레드가 while 루프에서 스핀합니다. 반면에 자동 리셋 이벤트 객체를 사용하면 하나의 대기 스레드가 해제됩니다.
또한 모든 스레드가 완료 될 때까지 대기하는 기본 스레드가 필요합니다. 나는 몇 가지 다른 접근법을 피곤했지만 작동시킬 수 없었다. 멀티 스레드 프로그래밍이 얼마나 어려운지 깨닫기 시작한 것 같습니다.
편집 :
1) 마이크로 - 관리 스레드 것은 당신이 발견으로 매우 어렵고 오류가 발생하기 쉬운입니다 : 문법
사용와 WaitForMultipleObjects()를 = 참이면 스레드 핸들에서 대기합니다. * 그런 다음 * ResetEvent를 호출 할 수 있습니다. –
작업자 스레드가 절대로 종료되지 않습니다. 그것들은 초기화 할 때 만들어지고, 할 일이있을 때마다 깨어 난다. 스레드 핸들에서 기다리는 것은 끝나지 않을 것입니다. – dklasic
이것은 전형적인 "소비자 - 생산자 패턴"인 것처럼 보입니다. Win32 API (Vista 이상)는 Condicion Variable을 제공하며 이러한 패턴을 구현하는 데 유용한 프리미티브입니다. 동기화 기본 정보에 익숙하지 않은 경우 http://msdn.microsoft.com/en-us/magazine/cc163405.aspx 및 http://msdn.microsoft.com/ko-kr/library/windows/을 참조하십시오. desktop/ms682052.aspx 등 – yohjp