디시인사이드 갤러리

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

갤러리 본문 영역

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

SODMaster갤로그로 이동합니다. 2012.03.24 19:14:42
조회 81 추천 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/11/24 - -
이슈 [디시人터뷰] 충무로가 주목하는 신예, '세계의 주인' 서수빈 운영자 25/11/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
308293 비줠 스튜디오 2010 궁금한점 [4] 야요이갤로그로 이동합니다. 12.03.25 70 0
308291 형들 c언어 실행종료되는거 질문좀 [1] 세탁범갤로그로 이동합니다. 12.03.25 60 0
308287 게임개발자 형들 잇음? ㄷㄱ(210.192) 12.03.25 78 0
308286 너무너무급해진짜 멋진형들 잘생긴형들 나좀 도와주면안될까 ㅜ [2] 나제발너무급(175.123) 12.03.25 66 0
308285 c언어 로또 만들기 도와주세요 형들 [1] 1515(1.230) 12.03.25 72 0
308284 개인적으로 실패했던 프로젝트... 아놔콘다갤로그로 이동합니다. 12.03.25 83 0
308283 형님들 도와줘요ㅜㅜ 할거없는데갤로그로 이동합니다. 12.03.25 25 0
308282 자바스크립트 고수형 도와주세요 ㅜㅜ [1] ㅇㄹㄴ(222.100) 12.03.25 104 0
308281 정보처리기사 존내쉽냉 금고래갤로그로 이동합니다. 12.03.25 82 0
308280 프갤엔 제대로된 프로그래머가 없는듯..ㅋㅋㅋㅋㅋㅋㅋㅋ [7] ㅋㅋㅋㅋ(125.141) 12.03.25 230 0
308278 보안전문가 될려면 얼루 가야함? 금고래갤로그로 이동합니다. 12.03.25 80 0
308277 패닉입니다 우와... [3] LASTOR갤로그로 이동합니다. 12.03.25 54 0
308276 c#고수님들 진짜 간단한건데 ㅠ. [1] c#(220.88) 12.03.25 65 0
308275 c언어기초문제인대 어려워요 ㅜㅜ 봐주세요형들 형님들부탁(61.255) 12.03.25 46 0
308274 웹표준과 웹접근성에 대해서 [2] Html갤로그로 이동합니다. 12.03.25 57 0
308273 html5 시대가 오면 전문 자바스크립털 이라는 직종이 생겨나겠지. 홍야(222.237) 12.03.25 108 0
308272 과제 올리는 놈들 답 구해줬으면 최소한 고맙다고 말이라도해야하는거 아니냐 RKRNP갤로그로 이동합니다. 12.03.25 78 0
308271 이클립스 jvm에러 질문점 헤헤헤헤갤로그로 이동합니다. 12.03.25 353 0
308268 토익 800초반 나오는데 더 올려야되나 ???? [5] adsf(211.117) 12.03.25 139 0
308267 프로세스 동기화에 대해 설명좀 해주세요 ㅜㅜ [3] 햐양(61.73) 12.03.25 127 0
308264 또 글 지우고 튀었네 [2] kukyakya(183.107) 12.03.25 60 0
308263 형들 숫자들 사칙연산 이런식으로 해도 계산 되요? [2] c언어짜증나(175.118) 12.03.25 59 0
308261 질문이요 프고수님들!!!!!!! [1] LASTOR갤로그로 이동합니다. 12.03.25 31 0
308260 정전 돋네 생물학(175.115) 12.03.25 23 0
308259 printf와 scanf 둘이 문자열 처리가 다르네 생물학(175.115) 12.03.25 27 0
308258 고졸취업 vs 대학진학 [3] 아라라라(115.41) 12.03.25 221 0
308257 fork() 함수 질문 좀 할께 형들.. [1] 십라라갤로그로 이동합니다. 12.03.25 85 0
308254 리버싱 엔지니어링 강좌나 올릴까... [2] 일일육사사(203.229) 12.03.25 92 0
308253 fopen ofstream 둘중에 효율이 더좋은 함수는? [1] 데이브(182.209) 12.03.25 46 0
308249 형들 프로그램 잘하는 방법 없을까?? [1] 프로g(121.186) 12.03.25 66 0
308247 SAS할줄 아는분 아 제발 이거 해석좀 ㅠ 지미집꺄(115.161) 12.03.25 49 0
308245 나이 26에 게임개발 공부 시작하면 답없음? [7] ㅇㅁ(210.192) 12.03.25 301 0
308244 IT관련 직종에 일하시는분 ㅜㅜ 질문있습니다. [5] 하양(61.73) 12.03.25 182 0
308243 전산직 군무원 좋나 ? [1] 1234(211.117) 12.03.25 144 0
308242 씨언어 코딩 짜는 홈페이지 같은 곳 아는 사람 있어?? 예전에 본거 같은 [9] 123(210.222) 12.03.25 117 0
308240 아직도 대부분의 대학생들은 학교에서 Visual C++ 6.0쓰더라? [6] ewqewq(121.162) 12.03.25 140 0
308238 3d max에서 프레임관해 질문좀 그래픽노예갤에선 답변이없네욤 [1] DontMeddle갤로그로 이동합니다. 12.03.25 44 0
308237 아마추어개발자들이 많이 참가하는 사이트없냐/ 청새치.갤로그로 이동합니다. 12.03.25 62 0
308236 C#하는 잉여들없나? [1] 청새치.갤로그로 이동합니다. 12.03.25 75 0
308235 ASDF횽 밖에 안떠올라 asdfasdfasdf [1] 생물학(175.115) 12.03.25 40 0
308234 문자열 뒤집는 함수 만들때요... 다람쥐다람쥐(1.246) 12.03.25 59 0
308233 비주얼 스튜디오 질문.. LASTOR갤로그로 이동합니다. 12.03.25 35 0
308232 횽들 나 패닉임 [8] 생물학(175.115) 12.03.25 102 0
308227 현재 C와 C++을 통해 자료구조 공부하는 학생임다. [4] LASTOR갤로그로 이동합니다. 12.03.25 127 0
308226 웹 고수 횽들 봐 주셈 [4] dd(112.162) 12.03.25 86 0
308225 늅뉴비들은 필독해라 필독이다. (목숨이 걸린 내용이다) [11] 바보플머(218.155) 12.03.25 157 0
308224 api 이미지를 소수점으로 출력 어케해여? [1] 허경(222.114) 12.03.25 28 0
308223 롤을 지웠는데 미치겠음 ㅋㅋ [1] 꿀레(121.168) 12.03.25 58 0
308220 김포공항에 스터디 할만한곳 아는 횽? 쿄스케갤로그로 이동합니다. 12.03.25 207 0
308219 얘들아 c언어에서 char 포인터로 스트링 입력받는데 말야 [25] 니 코 가 뭐갤로그로 이동합니다. 12.03.25 129 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2