이젠.. 지쳤어.. 아.. 내 JPT

솔직히 이젠 어찌되도.. orz

#include <windows.h>
#include <stdio.h>

int A[100];

HANDLE hEventA;
HANDLE hEventB;

// 스레드 A
DWORD WINAPI MyThreadA(LPVOID arg)
{
 DWORD retval;

 // 이벤트 B(스레드B에서 SetEvent 함수가 올라올때까지)가 완료될때까지 기다리기
 retval = WaitForSingleObject(hEventB, INFINITE);
 if(retval == WAIT_FAILED)
  return 0;

 printf("난 3번을 찍어내는 0번 스레드에염\n");
 for(int i=0; i<100; i++)
 {
  A[i]=3;
  Sleep(10);
 }
 for(int i=0; i<100; i++)
  printf("%d ",A[i]);
 printf("\n");

 // 쓰기 완료를 알림
 SetEvent(hEventA);
 // 이벤트 제거
 CloseHandle(hEventA);

 return 0;
}

// 스레드 B
DWORD WINAPI MyThreadB(LPVOID arg)
{
 DWORD retval;

 retval = WaitForSingleObject(hEventA, INFINITE);
 if(retval == WAIT_FAILED)
  return 0;

 printf("난 4번을 찍어내는 1번 스레드에염\n");
 for(int i=99; i>=0; i--)
 {
  A[i] = 4;
  Sleep(10);
 }
 for(int i=0; i<100; i++)
  printf("%d ",A[i]);
 printf("\n");
 
 // 쓰기 완료를 알림
 SetEvent(hEventB);
 // 이벤트 제거
 CloseHandle(hEventB);

 return 0;
}

int main()
{
 int judge = 0;   // 우선 초기화
 while(1)
 {
  printf("어떤스레드를 먼저 실행하게 할껀가?\n");
  printf(" -> 0 : 0번스레드, 1 : 1번 스레드\n");
  scanf("%d",&judge);
  if(judge == 0 || judge == 1)
   break;
  else
   printf("0 아님 1만 입력하라고!");
 }

 //이벤트 생성
 if(judge == 0)
 {
  // A스레드를 비신호 상태로 만들어서 먼저 실행하게 만든다.
  hEventA = CreateEvent(NULL, FALSE, FALSE, NULL);
  if(hEventA == NULL)
   return -1;
  hEventB = CreateEvent(NULL, FALSE, TRUE, NULL);
  if(hEventB == NULL)
   return -1;
 }
 else
 {
  // B스레드를 비신호 상태로 만들어서 먼저 실행하게 한다.
  hEventA = CreateEvent(NULL, FALSE, TRUE, NULL);
  if(hEventA == NULL)
   return -1;
  hEventB = CreateEvent(NULL, FALSE, FALSE, NULL);
  if(hEventB == NULL)
   return -1;
 }

 // 두개의 스레드 생성
 HANDLE hThread[2];
 DWORD ThreadId[2];
 hThread[0] = CreateThread(NULL, 0, MyThreadA, NULL, 0, &ThreadId[0]);
 hThread[1] = CreateThread(NULL, 0, MyThreadB, NULL, 0, &ThreadId[1]);

 // 스레드 종료 대기
 WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
 
 //--- 결과 출력 ---//
 printf("최종결과는 이거에염 ㅡㅡ..\n");
 for(int i=0; i<100; i++)
  printf("%d ", A[i]);
 printf("\n");

 return 0;
}
/*
// p179 예제.. 임계영역 설정 방법
#include <windows.h>
#include <stdio.h>

int A[100];
int judge;     // 판단자
CRITICAL_SECTION cs;


DWORD WINAPI MyThread1(LPVOID arg)
{
 if(judge == 0)
  Sleep(1);      // 다음 스레드가 스케쥴링되게 잠깐 쉬게함..

 EnterCriticalSection(&cs);   // 임계영역 깃을 내림
 
 printf("난 3번을 찍어내는 0번 스레드에염\n");
 for(int i=0; i<100; i++)
 {
  A[i]=3;
  Sleep(10);
 }
 for(int i=0; i<100; i++)
  printf("%d ",A[i]);

 printf("\n");
 LeaveCriticalSection(&cs);   // 임계영역 깃을 올림
 return 0;
}

DWORD WINAPI MyThread2(LPVOID arg)
{
 if(judge == 1)
  Sleep(1);      // 다음 스레드가 스케쥴링되게 잠깐 쉬게함..

 EnterCriticalSection(&cs);

 printf("난 4번을 찍어내는 1번 스레드에염\n");
 for(int i=99; i>=0; i--)
 {
  A[i] = 4;
  Sleep(10);
 }
 for(int i=0; i<100; i++)
  printf("%d ",A[i]);

 printf("\n");
 LeaveCriticalSection(&cs);
 return 0;
}

int main()
{
 judge = 0;   // 우선 초기화
 while(1)
 {
  printf("어떤스레드를 먼저 쉬게할껀가?\n");
  printf(" -> 0 : 0번스레드, 1 : 1번 스레드\n");
  scanf("%d",&judge);
  if(judge == 0 || judge == 1)
   break;
  else
   printf("0 아님 1만 입력하라고!");
 }
 // 임계영역 생성
 InitializeCriticalSection(&cs);

 // 두개의 스레드 생성
 HANDLE hThread[2];
 DWORD ThreadId[2];
 hThread[0] = CreateThread(NULL, 0, MyThread1, NULL, 0, &ThreadId[0]);
 hThread[1] = CreateThread(NULL, 0, MyThread2, NULL, 0, &ThreadId[1]);

 // 스레드 종료 대기
 WaitForMultipleObjects(2, hThread, TRUE, INFINITE);

 // 임계 영역 제거
 DeleteCriticalSection(&cs);

 printf("최종결과는 이거에염 ㅡㅡ..\n");
 // 결과 출력
 for(int i=0; i<100; i++)
  printf("%d ", A[i]);

 printf("\n");

 return 0;
}
*/

/*
#include <windows.h>
#include <stdio.h>

#define BUFSIZE 16

HANDLE hReadEvent;
HANDLE hWriteEvent;
char buf[BUFSIZE];

DWORD WINAPI WriteThread(LPVOID arg)
{
 DWORD retval;

 for(int k=0; k<10; k++)
 {
  // 읽기 완료를 기다림.
  retval = WaitForSingleObject(hReadEvent, INFINITE);
  if(retval == WAIT_FAILED)
   break;

  // 공유 버퍼에 데이터 쓰기
  for(int i=0; i<BUFSIZE; i++)
   buf[i] = 3;

  // 쓰기 완료를 알림
  SetEvent(hWriteEvent);
 }

 // 이벤트 제거
 CloseHandle(hWriteEvent);

 return 0;
}

DWORD WINAPI ReadThread(LPVOID arg)
{
 DWORD retval;

 while(1)
 {
  // 쓰기 완료를 기다림
  retval = WaitForSingleObject(hWriteEvent, INFINITE);
  if(retval == WAIT_FAILED)
   break;

  // 읽을 데이터를 출력
  printf("Thread %d:\t", GetCurrentThreadId());
  for(int i=0; i<BUFSIZE; i++)
   printf("%d ", buf[i]);
  printf("\n");

  // 버퍼를 0으로 초기화
  ZeroMemory(buf, sizeof(buf));

  // 읽기 완료를 알림
  SetEvent(hReadEvent);
 }

 return 0;
}

int main()
{
 //이벤트 생성
 hReadEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
 if(hReadEvent == NULL)
  return -1;
 hWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
 if(hWriteEvent == NULL)
  return -1;

 // 세 개의 스레드 생성
 HANDLE hThread[3];
 DWORD ThreadId[3];
 hThread[0] = CreateThread(NULL, 0, WriteThread, NULL, 0, &ThreadId[0]);
 hThread[1] = CreateThread(NULL, 0, ReadThread, NULL, 0, &ThreadId[2]);
 hThread[2] = CreateThread(NULL, 0, ReadThread, NULL, 0, &ThreadId[2]);

 // 스레드 종료 대기
 WaitForMultipleObjects(3, hThread, TRUE, INFINITE);

 // 이벤트 제거
 CloseHandle(hReadEvent);

 printf("모든 작업을 완료했습니다.\n");

 return 0;
}
*/

컹..

숙제는.....어떻게 해야 하남..

악... orz

+ Recent posts