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

質問編集履歴

1

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

2021/01/15 13:10

投稿

Timosy
Timosy

スコア3

title CHANGED
File without changes
body CHANGED
@@ -24,161 +24,113 @@
24
24
  #include <mutex>
25
25
 
26
26
  //関数のプリ宣言
27
- void ThreadProcessA();
27
+ void ThreadProcessP1();
28
- void ThreadProcessB();
28
+ void ThreadProcessP2();
29
29
 
30
30
  //Mutex宣言
31
31
  std::mutex mutex;
32
32
 
33
33
  int A = 100;
34
34
  int B = 0;
35
+ int C = 0;
35
36
  boolean i = false;
36
37
 
37
38
  int main()
38
39
  {
39
40
  //マルチスレッドスタート
40
- std::thread thA(ThreadProcessA);
41
+ std::thread thP1(ThreadProcessP1);
41
- std::thread thB(ThreadProcessB);
42
+ std::thread thP2(ThreadProcessP2);
42
43
 
43
44
  //マルチスレッド終了
44
- thA.join();
45
+ thP1.join();
45
- thB.join();
46
+ thP2.join();
46
47
  }
47
48
 
48
- //スレッドA
49
+ //スレッドP1
49
- void ThreadProcessA()
50
+ void ThreadProcessP1()
50
51
  {
51
52
  while (A > 0)
52
53
  {
53
- A -= 1;
54
- std::lock_guard<std::mutex> lock(mutex);
55
- if (i)
56
54
  {
57
- printf("A=%d, B=%d, A+B=%d\n", A, B, A+B);
55
+ std::lock_guard<std::mutex> lock(mutex);
58
- i = false;
56
+ A -= 1;
57
+ Sleep(1);// このスリープを重い処理と見立てる
58
+ B += 1;
59
59
  }
60
- else i = true;
61
60
  }
61
+
62
62
  }
63
63
 
64
- //スレッドB
64
+ //スレッドP2
65
- void ThreadProcessB()
65
+ void ThreadProcessP2()
66
66
  {
67
67
  while (B < 100)
68
68
  {
69
- B += 1;
70
69
  std::lock_guard<std::mutex> lock(mutex);
71
- if (i)
72
- {
73
- printf("A=%d, B=%d, A+B=%d\n", A, B, A + B);
70
+ printf("A=%d, B=%d, A+B=%d\n", A, B, A+B);
74
- i = false;
75
- }
76
- else i = true;
77
71
  }
78
72
  }
79
73
  ```
74
+ このとき排他制御を用いない場合に,A+Bの値が100にならないときがあることは確認できましたが,排他制御を行う時(上記コード)を実行すると上手くいきません。
75
+ 排他制御にはセマフォが良いと聞きましたが使い方がいまいち理解できないのでどなたかご教授ください
80
76
 
81
77
  #実行結果
82
- このときA+Bが常に100にならなければならないので,何も上手くいっていない状況です.
78
+ このときAとBが1ずつずれていき,A+Bが常に100にならなければならないのですが最後の最後で一気に値が変わってい状況です.
83
79
  ```Result
84
- A=99, B=2, A+B=101
85
- A=99, B=4, A+B=103
86
- A=99, B=6, A+B=105
87
- A=99, B=8, A+B=107
88
- A=99, B=10, A+B=109
89
- A=99, B=12, A+B=111
90
- A=99, B=14, A+B=113
91
- A=99, B=16, A+B=115
92
- A=99, B=18, A+B=117
93
- A=99, B=20, A+B=119
94
- A=99, B=22, A+B=121
95
- A=99, B=24, A+B=123
96
- A=99, B=26, A+B=125
97
- A=99, B=28, A+B=127
98
- A=99, B=30, A+B=129
99
- A=99, B=32, A+B=131
100
- A=99, B=34, A+B=133
101
- A=99, B=36, A+B=135
102
- A=99, B=38, A+B=137
103
- A=98, B=38, A+B=136
104
- A=96, B=39, A+B=135
105
- A=94, B=39, A+B=133
106
- A=92, B=39, A+B=131
107
- A=90, B=39, A+B=129
108
- A=88, B=39, A+B=127
109
- A=86, B=39, A+B=125
110
- A=84, B=39, A+B=123
111
- A=82, B=39, A+B=121
112
- A=80, B=39, A+B=119
113
- A=78, B=39, A+B=117
114
- A=76, B=39, A+B=115
115
- A=76, B=40, A+B=116
116
- A=75, B=42, A+B=117
117
- A=75, B=44, A+B=119
118
- A=75, B=46, A+B=121
119
- A=75, B=48, A+B=123
120
- A=75, B=50, A+B=125
121
- A=75, B=52, A+B=127
122
- A=75, B=54, A+B=129
123
- A=74, B=54, A+B=128
124
- A=72, B=55, A+B=127
125
- A=70, B=55, A+B=125
126
- A=68, B=55, A+B=123
127
- A=66, B=55, A+B=121
128
- A=64, B=55, A+B=119
129
- A=62, B=55, A+B=117
130
- A=62, B=56, A+B=118
131
- A=61, B=58, A+B=119
132
- A=61, B=60, A+B=121
133
- A=61, B=62, A+B=123
134
- A=60, B=62, A+B=122
135
- A=60, B=64, A+B=124
136
- A=59, B=66, A+B=125
137
- A=59, B=68, A+B=127
138
- A=59, B=70, A+B=129
139
- A=59, B=72, A+B=131
140
- A=59, B=74, A+B=133
141
- A=58, B=74, A+B=132
142
- A=58, B=76, A+B=134
143
- A=57, B=78, A+B=135
144
- A=57, B=80, A+B=137
145
- A=56, B=80, A+B=136
146
- A=55, B=82, A+B=137
147
- A=55, B=84, A+B=139
148
- A=55, B=86, A+B=141
149
- A=55, B=88, A+B=143
150
- A=54, B=88, A+B=142
151
- A=52, B=89, A+B=141
152
- A=50, B=89, A+B=139
153
- A=48, B=89, A+B=137
154
- A=48, B=90, A+B=138
155
- A=48, B=92, A+B=140
156
- A=46, B=92, A+B=138
157
- A=45, B=94, A+B=139
158
- A=45, B=95, A+B=140
159
- A=44, B=97, A+B=141
160
- A=44, B=99, A+B=143
161
- A=44, B=100, A+B=144
162
- A=42, B=100, A+B=142
163
- A=40, B=100, A+B=140
164
- A=38, B=100, A+B=138
165
- A=36, B=100, A+B=136
166
- A=34, B=100, A+B=134
167
- A=32, B=100, A+B=132
168
- A=30, B=100, A+B=130
169
- A=28, B=100, A+B=128
170
- A=26, B=100, A+B=126
171
- A=24, B=100, A+B=124
172
- A=22, B=100, A+B=122
173
- A=20, B=100, A+B=120
174
- A=18, B=100, A+B=118
175
- A=16, B=100, A+B=116
176
- A=14, B=100, A+B=114
177
- A=12, B=100, A+B=112
178
- A=10, B=100, A+B=110
179
- A=8, B=100, A+B=108
180
- A=6, B=100, A+B=106
181
- A=4, B=100, A+B=104
182
- A=2, B=100, A+B=102
183
- A=0, B=100, A+B=100
80
+ A=100, B=0, A+B=100
81
+ A=100, B=0, A+B=100
82
+ A=100, B=0, A+B=100
83
+ A=100, B=0, A+B=100
84
+ A=100, B=0, A+B=100
85
+ A=100, B=0, A+B=100
86
+ A=100, B=0, A+B=100
87
+ A=100, B=0, A+B=100
88
+ A=100, B=0, A+B=100
89
+ A=100, B=0, A+B=100
90
+ A=100, B=0, A+B=100
91
+ A=100, B=0, A+B=100
92
+ A=100, B=0, A+B=100
93
+ A=100, B=0, A+B=100
94
+ A=100, B=0, A+B=100
95
+ A=100, B=0, A+B=100
96
+ A=100, B=0, A+B=100
97
+ A=100, B=0, A+B=100
98
+ A=100, B=0, A+B=100
99
+ A=100, B=0, A+B=100
100
+ A=100, B=0, A+B=100
101
+ A=100, B=0, A+B=100
102
+ A=100, B=0, A+B=100
103
+ A=100, B=0, A+B=100
104
+ A=100, B=0, A+B=100
105
+ A=100, B=0, A+B=100
106
+ A=100, B=0, A+B=100
107
+ A=100, B=0, A+B=100
108
+ A=100, B=0, A+B=100
109
+ A=100, B=0, A+B=100
110
+ A=100, B=0, A+B=100
111
+ A=100, B=0, A+B=100
112
+ A=100, B=0, A+B=100
113
+ A=100, B=0, A+B=100
114
+ A=100, B=0, A+B=100
115
+ A=100, B=0, A+B=100
116
+ A=100, B=0, A+B=100
117
+ A=100, B=0, A+B=100
118
+ A=100, B=0, A+B=100
119
+ A=100, B=0, A+B=100
120
+ A=100, B=0, A+B=100
121
+ A=100, B=0, A+B=100
122
+ A=100, B=0, A+B=100
123
+ A=100, B=0, A+B=100
124
+ A=100, B=0, A+B=100
125
+ A=100, B=0, A+B=100
126
+ A=100, B=0, A+B=100
127
+ A=100, B=0, A+B=100
128
+ A=100, B=0, A+B=100
129
+ A=100, B=0, A+B=100
130
+ A=100, B=0, A+B=100
131
+ A=100, B=0, A+B=100
132
+ A=100, B=0, A+B=100
133
+ A=100, B=0, A+B=100
134
+ A=100, B=0, A+B=100
135
+ A=0, B=100, A+B=100
184
136
  ```