로그인

검색

조회 수 1131 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄


#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <queue> // STL의 큐
#define FULL 99

using namespace std;

queue <int> Q;  // 공유자원 - 모든 스레드가 공유한다.
HANDLE hMutex;  // 접근을 동기(동시 접근을 막는다)화 하기 위한 방법
HANDLE hSem1;  // Q에 있는 자원의 갯수를 나타낸다.
HANDLE hSem2;  // Q에 있는 자원의 갯수를 나타낸다.

DWORD WINAPI Produce(void* p)
{
static int n = 0;
while(1)
{
n = n+1;

// 아래 If문을 뮤텍스 밖에 둔 이유?
// 뮤텍스 구간(?)에서는 자원을 consume 쓰레드가 이용할 수 없는 기능으로 인해서이다.
// 우리가 원하는 것은 큐Size 체크 후 100 이상이면, 잠시 생산을 중지하고 consume 쓰레드에서...
if(Q.size() >= FULL )
{
// 큐가 100을 넘으면 세마포어(hSem2) 초기치 count 1(max, 1)에서 
// WaitFroSingleObject에서 count는 0으로 되고 2번째인자가 INFINITE이므로
// hSem2가 Signaled 될때가지 대기한다.
// (consume 쓰레드에서 ReleaseSemaphore(hSem2)를 해주면 다시 count는 1로 증가하고
//  signal이되어 대기모드에서 해제되어 다음으로 넘어가게 된다.
WaitForSingleObject(hSem2, INFINITE); 
}

// Q의 독점적인 접근 권한을 얻는다.
WaitForSingleObject(hMutex, INFINITE);
Q.push(n); // 생산
printf("Produce: %d  [ Q: %d ]n", n, Q.size());
// Q에 넣었으므로 세마포어 증가
LONG old;
ReleaseSemaphore(hSem1, 1, &old);  
ReleaseMutex(hMutex);

Sleep((rand() % 20) * 10); // 생산자 속도 빠르게... 0.2 ~ 2초간 대기

}

return 0;
}

DWORD WINAPI Consume(void *)
{
while(1)
{
int n;
LONG old, old2;

WaitForSingleObject(hSem1, INFINITE);
WaitForSingleObject(hMutex, INFINITE);
n = Q.front();    // Q의 제일 윗 요소 얻기
Q.pop();        // Q의 제일 윗 요소 제거 
printf("tttttConsume: %d  [ Q: %d ]n", n, Q.size());    
ReleaseSemaphore(hSem1, 1, &old);     
ReleaseMutex(hMutex);

// produce 쓰레드에서 hSem2이 Wait.. 상태이면 signal이 되게 해서 대기모드를 해제한다
// 아래는 큐가 100이 안넘어도 작동은 하지만 최대치가 1이므로 count는 증가하지 않는다.
// ( produce 쓰레드에서 100이 넘으면, wait하고 소비자에서 소비하게 하고 releasesemaphore를 해서
//   다시 produce 쓰레드를 wait를 해제한다. )
ReleaseSemaphore(hSem2, 1, &old2);

Sleep((rand() % 20) * 50); // 소비자 속도 느리게... 0.2 ~ 2초간 대기.
}

return 0;
}

void main()
{
hMutex = CreateMutex(0, 0, "ACCESS_GUARD");
hSem1 = CreateSemaphore(0, 0, 100, "Q_COUNT"); // 초기 0, 최대 100개의 세마포어
hSem2 = CreateSemaphore(0, 1, 1, "Q_FLG");     // 초기 1, 최대 1개의 세마포어

srand(time(0));
HANDLE h[2];

h[0] = CreateThread(0, 0, Produce, 0, 0, 0);
h[1] = CreateThread(0, 0, Consume, 0, 0, 0);

WaitForMultipleObjects(2, h, TRUE, INFINITE);
}

 

 

이걸로 메시지 큐를 구현할 수 있을지는 미지수

 

http://cafe.naver.com/cppmaster/866

?

  1. Programming 게시판 관련

    Date2014.11.01 CategoryTool/etc ByMoA Views5293
    read more
  2. Visual C++ 시리얼 통신(RS-232) 강좌 (2)

    Date2013.07.28 CategoryAPI/MFC ByMoA Views5359
    Read More
  3. Visual C++ 시리얼 통신(RS-232) 강좌 (1)

    Date2013.07.28 CategoryAPI/MFC ByMoA Views7119
    Read More
  4. DLL 이란

    Date2013.07.28 CategoryAPI/MFC ByMoA Views1402
    Read More
  5. UpdateData(TRUE) or UpdateData(FALSE) 구분

    Date2013.07.28 CategoryAPI/MFC ByMoA Views1033
    Read More
  6. InvalidateRect 함수, flag성 메세지

    Date2013.07.25 CategoryAPI/MFC ByMoA Views936
    Read More
  7. UpdateWindow 함수에 대하여..

    Date2013.07.25 CategoryAPI/MFC ByMoA Views1023
    Read More
  8. 다이얼로그 resize 시 child control의 그래픽 깨짐 해결

    Date2013.07.25 CategoryAPI/MFC ByMoA Views1909
    Read More
  9. Property Sheet의 버튼 속성 변경하기

    Date2013.07.25 CategoryAPI/MFC ByMoA Views1013
    Read More
  10. CPaneDialog 초기화 (OnInitDialog)

    Date2013.07.18 CategoryAPI/MFC ByMoA Views1509
    Read More
  11. CDockablePane 버튼 비활성화 문제

    Date2013.07.17 CategoryAPI/MFC ByMoA Views2044
    Read More
  12. CDockablePane 배경화면 회색으로 변경

    Date2013.07.11 CategoryAPI/MFC ByMoA Views1463
    Read More
  13. CPaneDialog의 context menu 안뜨게 하기

    Date2013.06.12 CategoryAPI/MFC ByMoA Views1219
    Read More
  14. 리스트 컨트롤 클릭 이벤트

    Date2013.06.12 CategoryAPI/MFC ByMoA Views1160
    Read More
  15. Which Font is the default for MFC Dialog Controls

    Date2013.06.12 CategoryAPI/MFC ByMoA Views823
    Read More
  16. 세마포어를 이용한 생산/소비자

    Date2012.08.31 CategoryAPI/MFC ByNaya Views1131
    Read More
  17. stdafx.h 사용 (미리 컴파일된 헤더)

    Date2012.08.13 CategoryAPI/MFC ByNaya Views1586
    Read More
  18. 윈도우 프로그램의 종료 메시지 순서

    Date2012.08.03 CategoryAPI/MFC ByNaya Views1360
    Read More
  19. Deploying a Visual C++ Application (배포 방법)

    Date2012.08.02 CategoryAPI/MFC ByNaya Views1583
    Read More
  20. MFC 클래스간 통신

    Date2012.08.02 CategoryAPI/MFC ByNaya Views2059
    Read More
  21. 모달리스 대화상자

    Date2012.08.02 CategoryAPI/MFC ByNaya Views1513
    Read More
Board Pagination Prev 1 2 3 4 Next
/ 4