본문 바로가기

TCP IP

세마포어 예제1


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>

#pragma comment("lib,"ws2_32.lib")

void * thread_snd(void *arg);
void * thread_recv(void *arg);

sem_t bin_sem;
int number=0;// 0:데이타 무 1:데이타 유

char thread1[]="A THREAD";
char thread2[]="B THREAD";
char thread3[]="C THREAD";

int main(int argc,char **argv)

{
 pthread_t t1,t2,t3;
 void *thread_result;
 int state;

 state = sem_init(&bin_sem,0,0);
 if(state !=0)
 {
  puts("세마포어 초기화 실폐");
  exit(1);
 }

 pthread_create(&t1,NULL, thread_snd, &thread1);
// 쓰레드 생성 (id, 특성, 함수 포인터(루틴), 함수에 전달하고자하는 인자값)
 pthread_create(&t2,NULL, thread_rcv, &thread2);
 pthread_create(&t3,NULL, thread_rcv, &thread3);

 pthread_join(t1, &thread_result);
 pthread_join(t2, &thread_result);
 pthread_join(t3, &thread_result);

 printf("최종 number %d \n",number);
 sem_destroy(&bin_sem);

 return 0;
 
}

 void * thread_snd(void* arg)
 {
  int i;
  for(i=0;i<4;i++)
  {
   while(number!=0) // 0 일 때까지 계속 대기한다
    Sleep(1);

   number++;// 데이터를 가져다 놓음
   printf("실행: %s,number : %d\n",(char *)arg,number);
   sem_post(&bin_sem);// 세마포어 값 증가 : 가져다 놀지 않는 상황에서 가져가는 상황을 막고 있다
  }
 }

 void *thread_rcv(void *arg)
 {
  int i;
  for(i=0 ; i<2 ;i++)
  {
   sem_wait(&bin_sem);// 세마포어 값 감소 : 세마포가 1 일떄까지 대기한다
   number--;
   printf(" 실행 : %s, number : %d\n",(char*)arg,number);
  }
 }