티스토리 뷰

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define MAX_SIZE 2400
#define MAX_THREADS 5


typedef struct
{
    int queue[MAX_SIZE];
    int front, end;
    pthread_mutex_t mutex;
} Queue;

void init(Queue *q)
{
    q->front = 0;
    q->end = 0;
    pthread_mutex_init(&(q->mutex), NULL);
}

int isEmpty(Queue *q)
{
    if(q->front == q->end)
        return 1;
    else
        return 0;
}

int isFull(Queue *q)
{
    if((q->end+1) == MAX_SIZE)
        return 1;
    else 
        return 0;
}

void enQueue(Queue *q, int item)
{

    if(!isFull(q))
    {
            pthread_mutex_lock(&(q->mutex));
            q->end++;
            q->queue[q->end] = item;
            pthread_mutex_unlock(&(q->mutex));
    }

}

int deQueue(Queue *q)
{
    int data;
    
    if(!isEmpty(q))
    {
        pthread_mutex_lock(&(q->mutex));
        q->front++;
        data = q->queue[q->front];
        pthread_mutex_unlock(&(q->mutex));
    }
    return data;
}

void* dice(void * arg)
{
    int i, n;
    Queue *q = (Queue*) arg;
    for(i = 0; i < 1000 ; i++)
    {
        n = rand()%6 + 1;
        enQueue(q, n);
    }
    //printf("dice complete\n");
}
void* probaillity(void *arg)
{
    Queue *q = (Queue*) arg;
    int a[600];
    int dice[6];
    double per[5];
    int i, tmp;
    
    for(i = 0; i < 6 ; i++)
    {
        dice[i] = 0;
    }

    for(i = 0 ; i < 600 ; i++)
    {
        tmp = deQueue(q) - 1;
        dice[tmp]++;
    }


    pthread_mutex_lock(&(q->mutex));
        printf("thread:%u\nPercentage : \n",pthread_self());
        for(i = 0 ; i < 6 ; i++)
        {
            printf("<%d : %.3lf>\n",i+1, (double)dice[i]/600);
        }
    pthread_mutex_unlock(&(q->mutex));
    
    printf("\n");
}
int main()
{
    Queue *q;
    int i;
    pthread_t thr[MAX_THREADS];

    srand(time(NULL));

    q = (Queue*) malloc(sizeof(Queue));

    init(q);
    
    for(i = 0; i < 2 ; i++)
    {
        pthread_create(&thr[i], NULL, dice, (void*)q);
    }
    for(i = 0; i < 2 ; i++)
    {
        pthread_join(thr[i], NULL);
    }

    for(i = 2; i < 5 ; i++)
    {
        pthread_create(&thr[i], NULL, probaillity, (void*)q);
    }

    for(i = 2 ; i < 5 ; i++)
    {
        pthread_join(thr[i], NULL);
    }


    return 0;
}

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함