view parallel_processing/ppb_data_shared/ppb_data_shared.cc @ 12:47f90873a72c

add comment
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Fri, 03 Jan 2014 21:11:11 +0900
parents f522b6bf6789
children
line wrap: on
line source

#include <stdio.h>
#include <pthread.h>

#define THREAD_NUM 2
#define DATA_NUM 10

typedef struct _thread_arg {
    int thread_no;
    int *data;
    pthread_mutex_t *mutex;
} thread_arg_t;

void *
thread_func(void *arg)
{
    thread_arg_t *targ = (thread_arg_t *)arg;
    int result;

    /* starting mutex and ending mutex*/
    for (int i = 0; i < DATA_NUM; i++) {
        pthread_mutex_lock(targ->mutex);
        result = targ->data[i] + 1;
        sched_yield();
        targ->data[i] = result;
        pthread_mutex_unlock(targ->mutex);
    }
    return 0;
}

int
main()
{
    pthread_t handle[THREAD_NUM];
    thread_arg_t targ[THREAD_NUM];
    int data[DATA_NUM];
    int i;
    pthread_mutex_t mutex;

    /* initialize */
    for (i = 0; i < DATA_NUM; i++) data[i] = 0;

    /* initialized mutex*/
    pthread_mutex_init(&mutex, NULL);

    /* spawn thread a number of THREAD_NUM */
    for (i = 0; i < THREAD_NUM; i++) {
        targ[i].thread_no = i;
        targ[i].data = data;
        targ[i].mutex = &mutex;

        /* spawn thread*/
        pthread_create(&handle[i], NULL, &thread_func, (void*)&targ[i]);
    }

    /* wait for running all thread */
    for (i = 0; i < THREAD_NUM; i++) pthread_join(handle[i], NULL);

    /* destroy mutex*/
    pthread_mutex_destroy(&mutex);

    for (i = 0; i < DATA_NUM; i++) printf("data%d : %d\n", i, data[i]);
    return 0;
}