티스토리 뷰

#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;
}

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함