디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

Lock Free 한 병렬 프로그래밍이 가능할까?

SODMaster갤로그로 이동합니다. 2012.03.24 19:14:42
조회 83 추천 0 댓글 3

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

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

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

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

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 이제는 의미 없어진 것 같은 시상식은? 운영자 25/12/01 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
309088 액션 스크립트 좀 하시는 분 잡귀민갤로그로 이동합니다. 12.04.02 46 0
309087 아랫글을 보니.. [1] 빌어먹을야옹갤로그로 이동합니다. 12.04.02 41 0
309085 타이머를 만들려고 하는데요. [3] 인생(222.102) 12.04.02 73 0
309084 c++로 로또 프로그램을 만들려고 하는데... [3] 초보(117.123) 12.04.02 75 0
309083 주임이 기분이 안좋은갑다;;;;; [1] Html갤로그로 이동합니다. 12.04.02 73 0
309082 형들 왕초보인데 질문점.. 개초보(61.106) 12.04.02 43 0
309081 전번에 커뮤니티 만든다고 한 놈인데 [4] 찌부된초코빵갤로그로 이동합니다. 12.04.02 81 0
309077 형들 CRect의 개념좀 이해시켜줘 [3] 세달뒤면몸짱갤로그로 이동합니다. 12.04.02 88 0
309074 if문 질문있습니다. [2] 초잉여(106.103) 12.04.02 66 0
309071 MFC관련 뭐하나만 알려줘; [7] 모자란동생(61.109) 12.04.02 84 0
309070 WINAPI로 ReadWriteLock 만드는거 질문점... SODMaster갤로그로 이동합니다. 12.04.02 63 0
309069 네이버 백신 스마트 디펜서인가 짱나네.. ㅇㅇ(58.102) 12.04.02 75 0
309067 오랜만입니다 [1] +어게인갤로그로 이동합니다. 12.04.02 34 0
309066 군대가기전에 뭐할까.. [3] ㅁㄴㅇㅁㄴㅇ(182.214) 12.04.02 86 0
309065 하찮은 숙제말고 [2] 페고떼찌갤로그로 이동합니다. 12.04.02 113 0
309064 유니코드를 구분하기위해 앞에 1을 붙인다는게뭔말이에요? [1] ●알콩이갤로그로 이동합니다. 12.04.02 76 0
309063 이거 책이 설명이 잘못된거에요?(java) [3] ●알콩이갤로그로 이동합니다. 12.04.02 77 0
309062 재귀함수로 팩토리얼값 구하는 프로그램.. [6] ㅇㅁ(114.199) 12.04.02 129 0
309061 자바 공부하는데 실수형 상수 이해안가는것 [2] ●알콩이갤로그로 이동합니다. 12.04.02 151 0
309060 자바의 syncronized wait notifyAll 처럼... SODMaster갤로그로 이동합니다. 12.04.02 98 0
309059 원래 소스는 즉흥적으로 짜는거에요? [18] ㅇㅁ(114.199) 12.04.02 217 0
309058 아 안드로이드존나 환경구축하기 스트레스바든ㄴ다 ㅡㅡ [3] 니 코 가 뭐갤로그로 이동합니다. 12.04.02 70 0
309057 형들 과제하는데 질문좀ㅠㅠ [2] 나가사키짱깨갤로그로 이동합니다. 12.04.02 42 0
309056 지역변수 질문 [11] ㅇㅁ(114.199) 12.04.02 70 0
309055 형들 나 과제 인데 급해 ㅠㅠ 개촙 .. .ㅠ [8] domangza갤로그로 이동합니다. 12.04.02 96 0
309053 지역변수 가리움 적용 질문 [1] ㅇㅁ(114.199) 12.04.02 44 0
309052 아 미치곘음 2차원 배열ㅋㅋㅋㅋ 프밍좆뉴비(211.44) 12.04.02 146 0
309051 다차원배열 질문 하나만 할꼐 형들 [2] 프밍좆뉴비(211.44) 12.04.02 48 0
309050 형들 C++ 에 관한건데 질문 받아주면 감사할께 [3] ㅂㅁㅋ(175.210) 12.04.02 47 0
309049 SQL 2008 늅늅 질문이여 [1] 얌얌(112.158) 12.04.02 31 0
309048 실력과 취업은 꼭 비례하지는 않나보다 [10] 전간디갤로그로 이동합니다. 12.04.02 288 0
309047 현직자 질문!!! 알바놈아 왜지우냐? [5] 나나(211.177) 12.04.02 112 0
309046 C언어] 내가 쓰는 MS2010 좀 이상한것같음 12(59.12) 12.04.02 50 0
309044 야씨발 android sdk 원래 이렇게 느리나..? [2] 니 코 가 뭐갤로그로 이동합니다. 12.04.02 53 0
309042 ㅡㅡ [1] 들럿갤로그로 이동합니다. 12.04.02 27 0
309041 수박 흰부분 맛없지앟ㄴ냐 [2] 니 코 가 뭐갤로그로 이동합니다. 12.04.02 56 0
309040 레노미나 고마움 [1] 니 코 가 뭐갤로그로 이동합니다. 12.04.02 46 0
309038 플밍 초보가 형님들께 질문올립니다 [9] 벵굼벵이붕갤로그로 이동합니다. 12.04.01 104 0
309037 왜 어떤 메뉴는 이미지로 잡히고 어떤 메뉴는 이미지가 아니야? [6] 스쿠터(210.106) 12.04.01 61 0
309036 님들 오늘 설치된 파일 확인 하렴녀 어떻게 해야 함요 돼지맨갤로그로 이동합니다. 12.04.01 27 0
309033 Deskjet 형 멋진데? [26] 니 코 가 뭐갤로그로 이동합니다. 12.04.01 141 0
309032 아니 얼탱이가 없느게 [7] 니 코 가 뭐갤로그로 이동합니다. 12.04.01 96 0
309031 야 대기업 보통 3천받지않냐 그리고 [4] 니 코 가 뭐갤로그로 이동합니다. 12.04.01 187 0
309029 씨언어 질문 다시 할꼐요 [3] 123(125.133) 12.04.01 79 0
309028 씨언어 좀 제빌 도와줍쇼 [4] 123(125.133) 12.04.01 73 0
309027 어씨발 api열뻗치네 이거 이상하냐? [1] 니 코 가 뭐갤로그로 이동합니다. 12.04.01 43 0
309026 여자친구 있는데 딴여자가 눈에 들어오면 개새끼임? [2] 니 코 가 뭐갤로그로 이동합니다. 12.04.01 110 0
309025 현업에서 쓰이는 코드 얻을곳없을까요 [5] 중간점검갤로그로 이동합니다. 12.04.01 82 0
309024 java배운지 3일댓는데 질문좀 [4] 초봉(121.165) 12.04.01 73 0
309023 jsp에서 쿠이와 세션 용자님 모십니다 (__) 굽신 [3] asdf(121.128) 12.04.01 51 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2