반응형

C언어로 Multi thread 구조를 만들다보면 자연스럽게 사용하게 되는 mutex lock과 conditional variable에 관한 예지이다.

 

 

#include "sys/time.h"
#include "sys/types.h"
#include <sys/poll.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

#define   ITER  30

int                 g_data[ITER];

pthread_cond_t      cond[ITER];
pthread_mutex_t     mutex[ITER];


void* producer(void *data){
    int  rc;
    int  idx = 0;

    while (1) {
        int idx_mod = idx % ITER;
        rc = pthread_mutex_lock(&mutex[idx_mod]);
        g_data[idx_mod] = idx;
#ifdef __STDOUT_PRINT__
        printf("producer.data: %d\n", g_data[idx_mod]);
        fflush(NULL);
#endif
        rc = pthread_cond_signal(&cond[idx_mod]);
        rc = pthread_mutex_unlock(&mutex[idx_mod]);
        poll(0, 0, 1);
        idx++;
    }
}


void* consumer(void *data){
    int  rc;
    int  my_thr_idx = *(int *)data;

    printf("consumer thread idx: %d\n", my_thr_idx);

    while (1) {
        rc = pthread_mutex_lock(&mutex[my_thr_idx]);
        rc = pthread_cond_wait(&cond[my_thr_idx], &mutex[my_thr_idx]);
#ifdef __STDOUT_PRINT__
        printf("comsumer[%d].data: %d\n\n", my_thr_idx, g_data[my_thr_idx]);
        fflush(NULL);
#endif
        rc = pthread_mutex_unlock(&mutex[my_thr_idx]);
    }
}

int main()
{
    //
    // producer thread
    //
    pthread_t    thr_id_prod;
    if (pthread_create(&thr_id_prod, NULL, producer, NULL) != 0) {
        printf("thread create error(%d, %s)\n", errno, strerror(errno));
        return 0;
    }

    poll(0, 0, 1000);

    //
    // consumer thread
    //
    pthread_t    thr_id_cons[ITER];
    int          new_idx[ITER];
    for (int idx=0; idx<ITER; idx++) {
        new_idx[idx] = idx;
        pthread_mutex_init(&mutex[idx], NULL);
        pthread_cond_init(&cond[idx], NULL);
        if (pthread_create(&thr_id_cons[idx], NULL, consumer, (void *) &new_idx[idx]) != 0) {
            printf("thread create error(%d, %s)\n", errno, strerror(errno));
            return 0;
        }
    }

    int status;
    for (int idx=0; idx<ITER; idx++) {
        pthread_join(thr_id_cons[idx], (void **)&status);
    }

    return 0;
}

 

위와 같이 코드를 작성하고, gcc compiler로 실행 파일을 만든다.

 

$ gcc -D__STDOUT_PRINT__ main.c -o my_test_app

$ ./my_test_app

 

 

 

+ Recent posts