#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);
}
}
'TCP IP' 카테고리의 다른 글
커널 오브젝트 동기화 기법(Mutex) (0) | 2011.01.06 |
---|---|
fflush 스트림을 비운다(보낸다). (0) | 2010.03.11 |
윈도우즈 기반의 OOB( 긴급상황 예외상황 메세지전송)oob_recv_win.c (0) | 2010.03.10 |
readv & writev 함수의 사용 (0) | 2010.03.10 |
긴급 데이타전송 시 생성되는 패킷 과 특징 (0) | 2010.03.10 |