윈도우 정확히 당신이 원하는 것을 제공하지 않습니다. 그것이 제공하는 것은 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
감사합니다. Jerry, 정말 멋진 솔루션입니다. 스레드 풀링보다 큐를 더 좋아한다고 생각합니다. – Rich
완료 포트에서도 거의 동일한 결과를 얻을 수 있습니다. 나는 몇 년 전에 그것을하는 방법을 보여주는 예를 썼다. http://blogs.msdn.com/b/larryosterman/archive/2004/03/29/101329.aspx –
Im on Larry with this. 휠을 다시 발명하지 마십시오. 완료 포트는 이미 대기열 작업 발송 메커니즘을 구현합니다. –