2010-06-16 3 views
2

나는 여러 작업자 스레드와 작업을받는 주 스레드가있는 프로그램을 가지고있다. 주 스레드에서 작업을 동기화 된 대기열에 대기시키고 작업자 스레드를 모두 대기열에 대기 시키길 원합니다. 대기열에 뭔가가있을 때 작업자가 대기열에서 작업을 가져오고 나머지 작업은 다른 작업을 기다리는 중입니다.동기 대기열을 관리하는 Win32 API 함수 집합이 있습니까?

그러나 CreateMsgQueue (http://msdn.microsoft.com/en-us/library/ms885180.aspx)가 발견되었지만 Windows CE에서만 나타납니다.

나는이 글을 쓸 수 있음을 알고 있지만, 이미 뭔가가 존재한다면 나는 그것을 사용하지 않는 바보가 될 것입니다.

내가 비주얼 스튜디오에게 감사받은 2005

어떤 제안을 사용하여 C++로 개발하고있다.

감사 리치

답변

4

윈도우 정확히 당신이 원하는 것을 제공하지 않습니다. 그것이 제공하는 것은 thread pools입니다 - 이것들을 사용하면 직접 큐를 생성 할 필요가 없으며 스레드를 생성하거나 (직접) 관리 할 필요가 없습니다.

물론 동기화 대기열도 존재하며 Windows의 일부가 아닙니다. 내가 쓴 글은 다음과 같습니다 :

#ifndef QUEUE_H_INCLUDED 
#define QUEUE_H_INCLUDED 

#include <windows.h> 

template<class T, unsigned max = 256> 
class queue { 
    HANDLE space_avail; // at least one slot empty 
    HANDLE data_avail; // at least one slot full 
    CRITICAL_SECTION mutex; // protect buffer, in_pos, out_pos 

    T buffer[max]; 
    long in_pos, out_pos; 
public: 
    queue() : in_pos(0), out_pos(0) { 
     space_avail = CreateSemaphore(NULL, max, max, NULL); 
     data_avail = CreateSemaphore(NULL, 0, max, NULL); 
     InitializeCriticalSection(&mutex); 
    } 

    void push(T data) { 
     WaitForSingleObject(space_avail, INFINITE);  
     EnterCriticalSection(&mutex); 
     buffer[in_pos] = data; 
     in_pos = (in_pos + 1) % max; 
     LeaveCriticalSection(&mutex); 
     ReleaseSemaphore(data_avail, 1, NULL); 
    } 

    T pop() { 
     WaitForSingleObject(data_avail,INFINITE); 
     EnterCriticalSection(&mutex); 
     T retval = buffer[out_pos]; 
     out_pos = (out_pos + 1) % max; 
     LeaveCriticalSection(&mutex); 
     ReleaseSemaphore(space_avail, 1, NULL); 
     return retval; 
    } 

    ~queue() { 
     DeleteCriticalSection(&mutex); 
     CloseHandle(data_avail); 
     CloseHandle(space_avail); 
    } 
}; 

#endif 
+0

감사합니다. Jerry, 정말 멋진 솔루션입니다. 스레드 풀링보다 큐를 더 좋아한다고 생각합니다. – Rich

+4

완료 포트에서도 거의 동일한 결과를 얻을 수 있습니다. 나는 몇 년 전에 그것을하는 방법을 보여주는 예를 썼다. http://blogs.msdn.com/b/larryosterman/archive/2004/03/29/101329.aspx –

+2

Im on Larry with this. 휠을 다시 발명하지 마십시오. 완료 포트는 이미 대기열 작업 발송 메커니즘을 구현합니다. –