ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux Programming] Thread의 사용법 (Using Semaphore)
    0x05 Programming/Unix/Linux 2010. 10. 28. 10:57

    세마포어를 이용한 간단한 쓰레드 프로그래밍 예제이다. 
    #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);
    }
    
    
Designed by Tistory.