comparison parallel_processing/ppb_data_shared/ppb_data_shared.cc @ 11:f522b6bf6789

fix ppb_data_shared
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Fri, 03 Jan 2014 21:09:01 +0900
parents 51177cc6ab38
children 47f90873a72c
comparison
equal deleted inserted replaced
10:51177cc6ab38 11:f522b6bf6789
1 #include <stdio.h> 1 #include <stdio.h>
2 #include <pthread.h> 2 #include <pthread.h>
3 3
4 #define THREAD_NUM 2 4 #define THREAD_NUM 2
5 #define DATA_NUM 10 5 #define DATA_NUM 10
6 #define SPLIT_DATA_NUM (DATA_NUM / THREAD_NUM)
7 6
8 typedef struct _thread_arg { 7 typedef struct _thread_arg {
9 int thread_no; 8 int thread_no;
10 int *data; 9 int *data;
10 pthread_mutex_t *mutex;
11 } thread_arg_t; 11 } thread_arg_t;
12 12
13 void * 13 void *
14 thread_func(void *arg) 14 thread_func(void *arg)
15 { 15 {
16 thread_arg_t *targ = (thread_arg_t *)arg; 16 thread_arg_t *targ = (thread_arg_t *)arg;
17 int result;
17 18
18 for (int i = 0; i < SPLIT_DATA_NUM; i++) { 19 /* starting mutex and ending mutex*/
19 printf("thread%d : %d + 1 = %d\n", 20 for (int i = 0; i < DATA_NUM; i++) {
20 targ->thread_no, targ->data[i], targ->data[i] + 1); 21 pthread_mutex_lock(targ->mutex);
22 result = targ->data[i] + 1;
23 sched_yield();
24 targ->data[i] = result;
25 pthread_mutex_unlock(targ->mutex);
21 } 26 }
22 return 0; 27 return 0;
23 } 28 }
24 29
25 int 30 int
27 { 32 {
28 pthread_t handle[THREAD_NUM]; 33 pthread_t handle[THREAD_NUM];
29 thread_arg_t targ[THREAD_NUM]; 34 thread_arg_t targ[THREAD_NUM];
30 int data[DATA_NUM]; 35 int data[DATA_NUM];
31 int i; 36 int i;
37 pthread_mutex_t mutex;
32 38
33 /* initialize */ 39 /* initialize */
34 for (i = 0; i < DATA_NUM; i++) data[i] = i; 40 for (i = 0; i < DATA_NUM; i++) data[i] = 0;
41
42 /* initialized mutex*/
43 pthread_mutex_init(&mutex, NULL);
35 44
36 /* spawn thread a number of THREAD_NUM */ 45 /* spawn thread a number of THREAD_NUM */
37 for (i = 0; i < THREAD_NUM; i++) { 46 for (i = 0; i < THREAD_NUM; i++) {
38 targ[i].thread_no = i; 47 targ[i].thread_no = i;
48 targ[i].data = data;
49 targ[i].mutex = &mutex;
39 50
40 /* divide a data into THREAD_NUM*/
41 targ[i].data = &data[SPLIT_DATA_NUM * i];
42 /* spawn thread*/ 51 /* spawn thread*/
43 pthread_create(&handle[i], NULL, &thread_func, (void*)&targ[i]); 52 pthread_create(&handle[i], NULL, &thread_func, (void*)&targ[i]);
44 } 53 }
45 54
46 /* wait for running all thread */ 55 /* wait for running all thread */
47 for (i = 0; i < THREAD_NUM; i++) pthread_join(handle[i], NULL); 56 for (i = 0; i < THREAD_NUM; i++) pthread_join(handle[i], NULL);
57
58 pthread_mutex_destroy(&mutex);
59
60 for (i = 0; i < DATA_NUM; i++) printf("data%d : %d\n", i, data[i]);
48 return 0; 61 return 0;
49 } 62 }