// 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개가 메시지 큐의 내용을 처리하는 형태인데...

이렇게 되면 모든 객체들은 리턴값에는 의미가 없어지는거고 모두 메시지로 통신하는거지...

동기화 하는 부분은 메시지 큐 접근시에만 락을 걸어주는 것 뿐 각각의 객체들은 받은 메시지에 대해서만 처리를 하면 되니까 말이지..

시간의 흐름 처리나 동시성 제어도 간단해 지지 않을까.