세마포어를 이용한 간단한 쓰레드 프로그래밍 예제이다.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h> // 세마포어 용
int g_rc[3] = {-1, -1, -1};
sem_t g_sema; // Step 1
void* WorkProc(void* para)
{
int id = (int)para;
printf("\t %d Child Start------\n", id);
int i, j, k;
int rc_id;
for(i=0; i<5; i++)
{
sem_wait(&g_sema); // 자원할당
rc_id = -1;
for(k=0; k<3; k++)
{
if(-1 == g_rc[k])
{
g_rc[k] = id;
rc_id = k;
break;
}
}
/*if(-1 == rc_id)
{
i--;
continue;
}*/
for(j=0; j<3; j++)
{
printf("\t\t id=%d : i=%d : j=%d : r=%d\n", id, i, j, rc_id);
sleep(1);
}
if(-1 != g_rc[rc_id])
{
g_rc[rc_id] = -1;
}
sem_post(&g_sema); //자원반납
}
printf("\t %d Child end-----\n", id);
pthread_exit("Child end");
}
//세마포어 : 제한된 자원일때 사용 커널Lev 자원관리
int main(int argc, char** argv)
{// 속성 - Linker - -lpthread
printf("Main Start ======\n");
int i;
pthread_t aId[10];
void* b;
sem_init(&g_sema, 0, 3); // step 2 // 0:동일한 프로세서 1:멀티프로세서 // 자원갯수
for(i=0; i<10; i++)
{
pthread_create(&aId[i], NULL, WorkProc, (void*)i);
}
printf("Main Wait ===\n");
for(i=0; i<10; i++)
{
pthread_join(aId[i], &b);
}
sem_destroy(&g_sema); // step 3
printf("Main End =========\n");
return (EXIT_SUCCESS);
}