2012-05-04 3 views
1

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) 마이크로 - 관리 스레드 것은 당신이 발견으로 매우 어렵고 오류가 발생하기 쉬운입니다 : 문법

+1

사용와 WaitForMultipleObjects()를 = 참이면 스레드 핸들에서 대기합니다. * 그런 다음 * ResetEvent를 호출 할 수 있습니다. –

+0

작업자 스레드가 절대로 종료되지 않습니다. 그것들은 초기화 할 때 만들어지고, 할 일이있을 때마다 깨어 난다. 스레드 핸들에서 기다리는 것은 끝나지 않을 것입니다. – dklasic

+0

이것은 전형적인 "소비자 - 생산자 패턴"인 것처럼 보입니다. 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

답변

0

이것은 정말 나쁜 생각입니다. 둥근 방법은 그것을하지 않는 것입니다.

2) 작업 스레드가 완료 될 때까지 GUI 스레드에서 기다리는 중입니다. 실제로는 아무 문제가 없습니다. 작업 스레드가 완료되면 GUI 스레드에 신호를 보냅니다. PostMessage()에 의해 괜찮습니다.

같은 스레드 프로 시저를 실행하는 작업 스레드가 여러 개 있습니다. 그들은 동일한 코드를 실행하므로 서로 다른 데이터에서 작동합니다. 쓰레드가 작동하는 데이터에 대해 좀 더 자세히 설명해 주시겠습니까? 스레드 풀에 작업 객체/구조체를 대기열에 추가하게 될 것이라고 생각하지만 자세한 내용이 필요합니다.

멀티 스레드 프로그래밍은 그다지 어렵지 않습니다. 가장 중요한 세부 사항입니다. 코드와 관련이 없으며 (이상적으로는 모든 스레드 인스턴스), 데이터를 관리하는 방법에 관한 것입니다. 어떻게 돌아 다니는지. 안타깝게도, 그물에 풍부해진 쓰레기 처리의 실용적인 예를 피하는 것도 중요합니다. (

+0

GUI 스레드에서 기다리는 중입니다. 데이터는 큰 바이트 버퍼입니다. 각 스레드는 그것의 덩어리를 가져 와서 그것에서 /에서 뭔가를 찾고/추출하려고 시도합니다. – dklasic

+1

응답이 없기 때문에 다운 voting. 질문자는 작업자 스레드를 깨우는 문제에 대한 해결책을 요청했습니다. "스레드를 마이크로 관리하지 마십시오"는 대답이 아닙니다. 묻는 사람이 왜 이런 식으로해야하는지 알 수 없습니다. 또한 질문은 GUI 스레드를 언급하지 않았으므로 질문과 관련이없는 내용을 가정했습니다. –

+0

하향 투표도 마찬가지입니다. Ross Bencina와 같은 이유. – rxantos

0

작업자 스레드는 낮은 우선 순위로 설정할 수 있습니다 (GUI (메인) 스레드는 (주 스레드에서 어떤 작업도 수행하지 않고 바쁘게 유지하는 한) 응용 프로그램이 사용자 입력에보다 응답하게됩니다. 또한 thread_proc에서() "아무 일이 없었다"경우, 작업자 스레드가 어떻게 든, 그래서 두 번째 또는 예 : 대기 (절전)을 얻을 수있다.

또 다른 방법은 장갑차를 사용할 수 있습니다. bWaitAll와