티스토리 뷰
#include <stdio.h>
#include <pthread.h>
#include "timers.h"
#define MAX_NUM 100000
#define NUM_THREADS 4
typedef struct
{
pthread_mutex_t* mutex;
int *p;
int *n;
int *lock;
} thread_args;
int p=0;
void _lock(int *_lock){
while(__sync_lock_test_and_set(_lock, 1));
}
void _release(int *_lock)
{
*_lock = 0;
}
void* func (void* arg)
{
int i;
thread_args * args = (thread_args*) arg;
pthread_mutex_t *mutex = args->mutex;
int nn = args->n;
int *p = args->p;
int *lock = args->lock;
timer_start(nn);
if(nn==1)
{
for(i = 0; i < MAX_NUM ; i++)
{
pthread_mutex_lock(mutex);
*p = *p + 1;
pthread_mutex_unlock(mutex);
}
}
else if(nn==2)
{
pthread_mutex_lock(mutex);
for(i = 0; i < MAX_NUM ; i++)
{
*p = *p + 1;
}
pthread_mutex_unlock(mutex);
}
else if(nn==3)
{
for(i = 0; i < MAX_NUM ; i++)
{
__sync_fetch_and_add(p, 1);
}
}
else if(nn==4)
{
for(i = 0; i < MAX_NUM ; i++)
{
_lock(lock);
*p += 1;
_release(lock);
}
}
timer_stop(nn);
switch(nn)
{
case 1 :
printf("mutex ");
break;
case 2 :
printf("mutex outside loop ");
break;
case 3 :
printf("fetch and add ");
break;
case 4 :
printf("test and set ");
break;
}
printf("%d thread - time elapsed : %lf sec\n",nn,timer_read(nn));
return NULL;
}
int main(int argc, char** argv)
{
pthread_t thr[NUM_THREADS];
pthread_mutex_t mutex;
thread_args args[NUM_THREADS];
int i,v,z,lock;
pthread_mutex_init(&mutex,NULL);
v = 0;
z = 0;
lock = 0;
for(i = 0; i < NUM_THREADS ; i++)
{
args[i].mutex = &mutex;
args[i].p = &v;
args[i].n = ++z;
args[i].lock = &lock;
}
for(i = 0; i < NUM_THREADS ; i++)
{
pthread_create(&thr[i], NULL, func, &args[i]);
}
for(i = 0; i < NUM_THREADS ; i++)
{
pthread_join(thr[i],NULL);
}
printf("result P : %d\n", v);
// printf("Time elapsed : %lf\n",timer_read(1));
pthread_mutex_destroy(&mutex);
return 0;
}
' la fermata, 개발 > Pthread' 카테고리의 다른 글
False sharing 예제 (0) | 2019.02.19 |
---|---|
Thread Affinity 사용해보기 (0) | 2019.02.19 |
타일링을 이용한 행렬 곱셈 (0) | 2019.02.19 |
큐를 이용한 주사위 확률 구하기 (0) | 2019.02.19 |
병렬 계수 정렬(Parallel counting sort (0) | 2019.02.19 |