質問編集履歴

1

問題の解釈をそもそも間違っていたため,コードを修正しました。

2021/01/15 13:10

投稿

Timosy
Timosy

スコア3

test CHANGED
File without changes
test CHANGED
@@ -50,9 +50,9 @@
50
50
 
51
51
  //関数のプリ宣言
52
52
 
53
- void ThreadProcessA();
53
+ void ThreadProcessP1();
54
-
54
+
55
- void ThreadProcessB();
55
+ void ThreadProcessP2();
56
56
 
57
57
 
58
58
 
@@ -66,6 +66,8 @@
66
66
 
67
67
  int B = 0;
68
68
 
69
+ int C = 0;
70
+
69
71
  boolean i = false;
70
72
 
71
73
 
@@ -76,25 +78,25 @@
76
78
 
77
79
  //マルチスレッドスタート
78
80
 
79
- std::thread thA(ThreadProcessA);
81
+ std::thread thP1(ThreadProcessP1);
80
-
82
+
81
- std::thread thB(ThreadProcessB);
83
+ std::thread thP2(ThreadProcessP2);
82
84
 
83
85
 
84
86
 
85
87
  //マルチスレッド終了
86
88
 
87
- thA.join();
89
+ thP1.join();
88
-
90
+
89
- thB.join();
91
+ thP2.join();
90
92
 
91
93
  }
92
94
 
93
95
 
94
96
 
95
- //スレッドA
97
+ //スレッドP1
96
-
98
+
97
- void ThreadProcessA()
99
+ void ThreadProcessP1()
98
100
 
99
101
  {
100
102
 
@@ -102,266 +104,168 @@
102
104
 
103
105
  {
104
106
 
107
+ {
108
+
109
+ std::lock_guard<std::mutex> lock(mutex);
110
+
105
- A -= 1;
111
+ A -= 1;
112
+
113
+ Sleep(1);// このスリープを重い処理と見立てる
114
+
115
+ B += 1;
116
+
117
+ }
118
+
119
+ }
120
+
121
+
122
+
123
+ }
124
+
125
+
126
+
127
+ //スレッドP2
128
+
129
+ void ThreadProcessP2()
130
+
131
+ {
132
+
133
+ while (B < 100)
134
+
135
+ {
106
136
 
107
137
  std::lock_guard<std::mutex> lock(mutex);
108
138
 
109
- if (i)
110
-
111
- {
112
-
113
- printf("A=%d, B=%d, A+B=%d\n", A, B, A+B);
139
+ printf("A=%d, B=%d, A+B=%d\n", A, B, A+B);
114
-
115
- i = false;
116
-
117
- }
118
-
119
- else i = true;
120
140
 
121
141
  }
122
142
 
123
143
  }
124
144
 
125
-
126
-
127
- //スレッドB
128
-
129
- void ThreadProcessB()
130
-
131
- {
132
-
133
- while (B < 100)
134
-
135
- {
136
-
137
- B += 1;
138
-
139
- std::lock_guard<std::mutex> lock(mutex);
140
-
141
- if (i)
142
-
143
- {
144
-
145
- printf("A=%d, B=%d, A+B=%d\n", A, B, A + B);
146
-
147
- i = false;
148
-
149
- }
150
-
151
- else i = true;
152
-
153
- }
154
-
155
- }
156
-
157
145
  ```
158
146
 
147
+ このとき排他制御を用いない場合に,A+Bの値が100にならないときがあることは確認できましたが,排他制御を行う時(上記コード)を実行すると上手くいきません。
148
+
149
+ 排他制御にはセマフォが良いと聞きましたが使い方がいまいち理解できないのでどなたかご教授ください
150
+
159
151
 
160
152
 
161
153
  #実行結果
162
154
 
163
- このときA+Bが常に100にならなければならないので,何も上手くいっていない状況です.
155
+ このときAとBが1ずつずれていき,A+Bが常に100にならなければならないのですが最後の最後で一気に値が変わってい状況です.
164
156
 
165
157
  ```Result
166
158
 
167
- A=99, B=2, A+B=101
168
-
169
- A=99, B=4, A+B=103
170
-
171
- A=99, B=6, A+B=105
172
-
173
- A=99, B=8, A+B=107
174
-
175
- A=99, B=10, A+B=109
176
-
177
- A=99, B=12, A+B=111
178
-
179
- A=99, B=14, A+B=113
180
-
181
- A=99, B=16, A+B=115
182
-
183
- A=99, B=18, A+B=117
184
-
185
- A=99, B=20, A+B=119
186
-
187
- A=99, B=22, A+B=121
188
-
189
- A=99, B=24, A+B=123
190
-
191
- A=99, B=26, A+B=125
192
-
193
- A=99, B=28, A+B=127
194
-
195
- A=99, B=30, A+B=129
196
-
197
- A=99, B=32, A+B=131
198
-
199
- A=99, B=34, A+B=133
200
-
201
- A=99, B=36, A+B=135
202
-
203
- A=99, B=38, A+B=137
204
-
205
- A=98, B=38, A+B=136
206
-
207
- A=96, B=39, A+B=135
208
-
209
- A=94, B=39, A+B=133
210
-
211
- A=92, B=39, A+B=131
212
-
213
- A=90, B=39, A+B=129
214
-
215
- A=88, B=39, A+B=127
216
-
217
- A=86, B=39, A+B=125
218
-
219
- A=84, B=39, A+B=123
220
-
221
- A=82, B=39, A+B=121
222
-
223
- A=80, B=39, A+B=119
224
-
225
- A=78, B=39, A+B=117
226
-
227
- A=76, B=39, A+B=115
228
-
229
- A=76, B=40, A+B=116
230
-
231
- A=75, B=42, A+B=117
232
-
233
- A=75, B=44, A+B=119
234
-
235
- A=75, B=46, A+B=121
236
-
237
- A=75, B=48, A+B=123
238
-
239
- A=75, B=50, A+B=125
240
-
241
- A=75, B=52, A+B=127
242
-
243
- A=75, B=54, A+B=129
244
-
245
- A=74, B=54, A+B=128
246
-
247
- A=72, B=55, A+B=127
248
-
249
- A=70, B=55, A+B=125
250
-
251
- A=68, B=55, A+B=123
252
-
253
- A=66, B=55, A+B=121
254
-
255
- A=64, B=55, A+B=119
256
-
257
- A=62, B=55, A+B=117
258
-
259
- A=62, B=56, A+B=118
260
-
261
- A=61, B=58, A+B=119
262
-
263
- A=61, B=60, A+B=121
264
-
265
- A=61, B=62, A+B=123
266
-
267
- A=60, B=62, A+B=122
268
-
269
- A=60, B=64, A+B=124
270
-
271
- A=59, B=66, A+B=125
272
-
273
- A=59, B=68, A+B=127
274
-
275
- A=59, B=70, A+B=129
276
-
277
- A=59, B=72, A+B=131
278
-
279
- A=59, B=74, A+B=133
280
-
281
- A=58, B=74, A+B=132
282
-
283
- A=58, B=76, A+B=134
284
-
285
- A=57, B=78, A+B=135
286
-
287
- A=57, B=80, A+B=137
288
-
289
- A=56, B=80, A+B=136
290
-
291
- A=55, B=82, A+B=137
292
-
293
- A=55, B=84, A+B=139
294
-
295
- A=55, B=86, A+B=141
296
-
297
- A=55, B=88, A+B=143
298
-
299
- A=54, B=88, A+B=142
300
-
301
- A=52, B=89, A+B=141
302
-
303
- A=50, B=89, A+B=139
304
-
305
- A=48, B=89, A+B=137
306
-
307
- A=48, B=90, A+B=138
308
-
309
- A=48, B=92, A+B=140
310
-
311
- A=46, B=92, A+B=138
312
-
313
- A=45, B=94, A+B=139
314
-
315
- A=45, B=95, A+B=140
316
-
317
- A=44, B=97, A+B=141
318
-
319
- A=44, B=99, A+B=143
320
-
321
- A=44, B=100, A+B=144
322
-
323
- A=42, B=100, A+B=142
324
-
325
- A=40, B=100, A+B=140
326
-
327
- A=38, B=100, A+B=138
328
-
329
- A=36, B=100, A+B=136
330
-
331
- A=34, B=100, A+B=134
332
-
333
- A=32, B=100, A+B=132
334
-
335
- A=30, B=100, A+B=130
336
-
337
- A=28, B=100, A+B=128
338
-
339
- A=26, B=100, A+B=126
340
-
341
- A=24, B=100, A+B=124
342
-
343
- A=22, B=100, A+B=122
344
-
345
- A=20, B=100, A+B=120
346
-
347
- A=18, B=100, A+B=118
348
-
349
- A=16, B=100, A+B=116
350
-
351
- A=14, B=100, A+B=114
352
-
353
- A=12, B=100, A+B=112
354
-
355
- A=10, B=100, A+B=110
356
-
357
- A=8, B=100, A+B=108
358
-
359
- A=6, B=100, A+B=106
360
-
361
- A=4, B=100, A+B=104
362
-
363
- A=2, B=100, A+B=102
364
-
365
- A=0, B=100, A+B=100
159
+ A=100, B=0, A+B=100
160
+
161
+ A=100, B=0, A+B=100
162
+
163
+ A=100, B=0, A+B=100
164
+
165
+ A=100, B=0, A+B=100
166
+
167
+ A=100, B=0, A+B=100
168
+
169
+ A=100, B=0, A+B=100
170
+
171
+ A=100, B=0, A+B=100
172
+
173
+ A=100, B=0, A+B=100
174
+
175
+ A=100, B=0, A+B=100
176
+
177
+ A=100, B=0, A+B=100
178
+
179
+ A=100, B=0, A+B=100
180
+
181
+ A=100, B=0, A+B=100
182
+
183
+ A=100, B=0, A+B=100
184
+
185
+ A=100, B=0, A+B=100
186
+
187
+ A=100, B=0, A+B=100
188
+
189
+ A=100, B=0, A+B=100
190
+
191
+ A=100, B=0, A+B=100
192
+
193
+ A=100, B=0, A+B=100
194
+
195
+ A=100, B=0, A+B=100
196
+
197
+ A=100, B=0, A+B=100
198
+
199
+ A=100, B=0, A+B=100
200
+
201
+ A=100, B=0, A+B=100
202
+
203
+ A=100, B=0, A+B=100
204
+
205
+ A=100, B=0, A+B=100
206
+
207
+ A=100, B=0, A+B=100
208
+
209
+ A=100, B=0, A+B=100
210
+
211
+ A=100, B=0, A+B=100
212
+
213
+ A=100, B=0, A+B=100
214
+
215
+ A=100, B=0, A+B=100
216
+
217
+ A=100, B=0, A+B=100
218
+
219
+ A=100, B=0, A+B=100
220
+
221
+ A=100, B=0, A+B=100
222
+
223
+ A=100, B=0, A+B=100
224
+
225
+ A=100, B=0, A+B=100
226
+
227
+ A=100, B=0, A+B=100
228
+
229
+ A=100, B=0, A+B=100
230
+
231
+ A=100, B=0, A+B=100
232
+
233
+ A=100, B=0, A+B=100
234
+
235
+ A=100, B=0, A+B=100
236
+
237
+ A=100, B=0, A+B=100
238
+
239
+ A=100, B=0, A+B=100
240
+
241
+ A=100, B=0, A+B=100
242
+
243
+ A=100, B=0, A+B=100
244
+
245
+ A=100, B=0, A+B=100
246
+
247
+ A=100, B=0, A+B=100
248
+
249
+ A=100, B=0, A+B=100
250
+
251
+ A=100, B=0, A+B=100
252
+
253
+ A=100, B=0, A+B=100
254
+
255
+ A=100, B=0, A+B=100
256
+
257
+ A=100, B=0, A+B=100
258
+
259
+ A=100, B=0, A+B=100
260
+
261
+ A=100, B=0, A+B=100
262
+
263
+ A=100, B=0, A+B=100
264
+
265
+ A=100, B=0, A+B=100
266
+
267
+ A=100, B=0, A+B=100
268
+
269
+ A=0, B=100, A+B=100
366
270
 
367
271
  ```