質問するログイン新規登録

質問編集履歴

1

コードの加筆

2021/06/16 06:43

投稿

Savanof
Savanof

スコア33

title CHANGED
File without changes
body CHANGED
@@ -30,7 +30,10 @@
30
30
  // 総和を収納する配列
31
31
  unsigned long sum = 0;
32
32
 
33
+ //Mutexオブジェクト
34
+ pthread_mutex_t mutex;
33
35
 
36
+
34
37
  pthread_t tid[THREAD_NUM]; // スレッドID を保持する配列
35
38
  int param[THREAD_NUM];
36
39
 
@@ -58,8 +61,10 @@
58
61
 
59
62
  // もし値が0(未作業)の場合は、data[i][0]の値をグローバル変数のsumに追加した後にdata[i][1]にスレッド番号を収納
60
63
  if (data[i][1] == 0){
64
+ pthread_mutex_lock(&mutex);
61
65
  sum = sum + data[i][0];
62
66
  data[i][1] = arg;
67
+ pthread_mutex_unlock(&mutex);
63
68
  }
64
69
 
65
70
  }
@@ -77,7 +82,10 @@
77
82
  data[i][1] = 0;
78
83
  }
79
84
 
85
+ //Mutexオブジェクトの初期化
86
+ pthread_mutex_init(&mutex, NULL);
80
87
 
88
+
81
89
  //指定された数のスレッドを作成する。
82
90
  for (int i =0; i < THREAD_NUM; i++){
83
91
  param[i] = i;
@@ -100,6 +108,21 @@
100
108
 
101
109
 
102
110
  }
111
+
112
+
113
+
114
+ //i=0からdata[i][1]を調べて、それが0だったら、「作業」が済んでいないとみなして、data[i][0]の値をグローバル変数sumに加算する。
115
+
116
+ //「作業済み」として、data[i][1]にスレッドを区別する番号(例えば、1からTHREAD_NUMのどれか)を代入して次のiを調べる。
117
+
118
+ //iが DATA_NUM-1まで調べたら各スレッドは終了する。
119
+
120
+ //すべてのスレッドが終了したら、mainの中で、sumの値と、各スレッドがsumに何回加算したかを表示する。
121
+
122
+ //各スレッドがsumに何回加算したかは、data[i][1]を全部調べて、その値を表示してください。
123
+
124
+ //sumを正しく計算するために、グローバル変数sumへの加算時と、data[i][1]で作業済みかどうかのチェックなどで必要な排他制御を行うプログラムにしてください。
125
+ //DATA_NUMが100の場合、0から99の和ですから、4950が答えになるはずです。
103
126
  ```
104
127
  ### 発生している問題・エラーメッセージ
105
128
  大方の実装は終わっているのですが、DATA_NUMの値が100000を超えた時の総和がおかしくなる、ワークフロー4.の「各スレッドがsumに何回加算したか計算する」の実装を行うにあたってスレッド番号が大きくなってしまう(実際の0,1,2,3...)というエラーが解決できていないです。