티스토리 뷰
#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;
}
' la fermata, 개발 > Pthread' 카테고리의 다른 글
False sharing 예제 (0) | 2019.02.19 |
---|---|
Thread Affinity 사용해보기 (0) | 2019.02.19 |
타일링을 이용한 행렬 곱셈 (0) | 2019.02.19 |
병렬 계수 정렬(Parallel counting sort (0) | 2019.02.19 |
fetch and add, test and set(TAS) 사용해보기 (0) | 2019.02.19 |