// Test.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
#include <queue>
#include <vector>
#include <process.h>
std::queue<DWORD> g_mq;
CRITICAL_SECTION g_mqcs;
std::vector<HANDLE> g_proc_thread_vector;
UINT CALLBACK proc_thread_func(VOID* param)
{
while (TRUE)
{
Sleep(10);
EnterCriticalSection(&g_mqcs);
if (g_mq.empty())
{
LeaveCriticalSection(&g_mqcs);
continue;
}
DWORD msg = g_mq.front();
g_mq.pop();
LeaveCriticalSection(&g_mqcs);
// do action
if (msg == 0)
{
EnterCriticalSection(&g_mqcs);
g_mq.push(msg);
LeaveCriticalSection(&g_mqcs);
break;
}
}
return 0;
}
INT _tmain(INT argc, _TCHAR* argv[])
{
InitializeCriticalSectionAndSpinCount(&g_mqcs, 2000);
// 스레드 생성
for (UINT i = 0; i < 4; ++i)
{
HANDLE thread_handle = (HANDLE)_beginthreadex(NULL, 0, proc_thread_func, NULL, CREATE_SUSPENDED, NULL);
g_proc_thread_vector.push_back(thread_handle);
}
// 스레드 시작
for (UINT i = 0; i < g_proc_thread_vector.size(); ++i)
{
ResumeThread(g_proc_thread_vector[i]);
}
// Initializer
g_mq.push(0); // 종료 메시지를 넣는다.
// 스레드 종료 대기
for (UINT i = 0; i < g_proc_thread_vector.size(); ++i)
{
while (TRUE)
{
if (WaitForSingleObject(g_proc_thread_vector[i], 100) == WAIT_OBJECT_0)
{
break;
}
}
}
// 스레드 정리
for (UINT i = 0; i < g_proc_thread_vector.size(); ++i)
{
CloseHandle(g_proc_thread_vector[i]);
}
g_proc_thread_vector.clear();
DeleteCriticalSection(&g_mqcs);
// Destroyer
while (!g_mq.empty())
{
DWORD msg = g_mq.front();
g_mq.pop();
// do action
}
return 0;
}
전역 메시지 큐 하나에 스레드 4개가 메시지 큐의 내용을 처리하는 형태인데...
이렇게 되면 모든 객체들은 리턴값에는 의미가 없어지는거고 모두 메시지로 통신하는거지...
동기화 하는 부분은 메시지 큐 접근시에만 락을 걸어주는 것 뿐 각각의 객체들은 받은 메시지에 대해서만 처리를 하면 되니까 말이지..
시간의 흐름 처리나 동시성 제어도 간단해 지지 않을까.
곰곰히 생각해보니 IOCP랑 비슷하네..
lock-free의 환상을 버려 smp에서 반응이 빨라지는 경향이 있긴 한데 그것도 경쟁 심해지면 CPU 점유율만 잡아먹고 효율은 비슷비슷해지는듯
성능도 성능문제지만.. 메시지 기반으로 프로그래밍을 하면 더 객체지향적으로 프로그래밍 할 수 있지 않을까 해서..