Mercurial > hg > Applications > Grep
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 } |