質問編集履歴

7

誤字を修正

2021/05/25 07:29

投稿

tkym_1231
tkym_1231

スコア57

test CHANGED
File without changes
test CHANGED
@@ -172,4 +172,4 @@
172
172
 
173
173
  ### 質問
174
174
 
175
- スレッド1がProc関数を処理中に、スレッド2がProc関数を呼んだ場合、正しく計算は行われますか?
175
+ スレッド1がProcess関数を処理中に、スレッド2がProcess関数を呼んだ場合、正しく計算は行われますか?

6

関数が抜けていたので追加

2021/05/25 07:29

投稿

tkym_1231
tkym_1231

スコア57

test CHANGED
File without changes
test CHANGED
@@ -9,6 +9,26 @@
9
9
  処理クラス(DLLとして実装)
10
10
 
11
11
  ```c++
12
+
13
+ float Proc(float* buf)
14
+
15
+ {
16
+
17
+ float total = 0.f;
18
+
19
+ for(int i=0; i<256; i++)
20
+
21
+ {
22
+
23
+ total += buf[i];
24
+
25
+ }
26
+
27
+ return total;
28
+
29
+ }
30
+
31
+
12
32
 
13
33
  class Hoge
14
34
 

5

質問内容を修正

2021/05/25 07:28

投稿

tkym_1231
tkym_1231

スコア57

test CHANGED
File without changes
test CHANGED
@@ -10,35 +10,25 @@
10
10
 
11
11
  ```c++
12
12
 
13
- float Proc(float* buf)
14
-
15
- {
16
-
17
- float total = 0.f;
18
-
19
- for(int i=0; i<256; i++)
20
-
21
- {
22
-
23
- total += buf[i];
24
-
25
- }
26
-
27
- return total;
28
-
29
- }
30
-
31
-
32
-
33
13
  class Hoge
34
14
 
35
15
  {
36
16
 
37
17
  public:
38
18
 
19
+ Hoge();
20
+
39
21
  float ProcessCall(float* buf);
40
22
 
41
23
  };
24
+
25
+ Hoge::Hoge()
26
+
27
+ {
28
+
29
+
30
+
31
+ }
42
32
 
43
33
 
44
34
 
@@ -51,6 +41,12 @@
51
41
  }
52
42
 
53
43
 
44
+
45
+ static Hoge s_hoge;
46
+
47
+
48
+
49
+ float process(float* buf){return s_hoge.ProcessCall(buf);}
54
50
 
55
51
  ```
56
52
 
@@ -66,25 +62,9 @@
66
62
 
67
63
  public:
68
64
 
69
- Wrapper();
70
-
71
65
  float Process(float* buf);
72
66
 
73
- private:
74
-
75
- Hoge* hoge;
76
-
77
67
  };
78
-
79
-
80
-
81
- Wrapper::Wrapper()
82
-
83
- {
84
-
85
- hoge = new Hoge();
86
-
87
- }
88
68
 
89
69
 
90
70
 
@@ -92,7 +72,7 @@
92
72
 
93
73
  {
94
74
 
95
- return hoge->ProcessCall(buf);
75
+ return process(buf);
96
76
 
97
77
  }
98
78
 

4

情報を追加

2021/05/25 07:27

投稿

tkym_1231
tkym_1231

スコア57

test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- 処理クラス
9
+ 処理クラス(DLLとして実装)
10
10
 
11
11
  ```c++
12
12
 

3

文言を修正。

2021/05/25 06:48

投稿

tkym_1231
tkym_1231

スコア57

test CHANGED
File without changes
test CHANGED
@@ -173,5 +173,3 @@
173
173
  ### 質問
174
174
 
175
175
  スレッド1がProc関数を処理中に、スレッド2がProc関数を呼んだ場合、正しく計算は行われますか?
176
-
177
- 自分の考えは、処理中にポインタの指す先が変わるので、計算結果が変わってしまうのではないかと考えています。

2

関数の説明が抜けていたので、追記

2021/05/25 06:40

投稿

tkym_1231
tkym_1231

スコア57

test CHANGED
File without changes
test CHANGED
@@ -39,6 +39,18 @@
39
39
  float ProcessCall(float* buf);
40
40
 
41
41
  };
42
+
43
+
44
+
45
+ float Hoge::ProcessCall(float* buf)
46
+
47
+ {
48
+
49
+ return Proc(buf);
50
+
51
+ }
52
+
53
+
42
54
 
43
55
  ```
44
56
 

1

質問内容を全体的に修正

2021/05/25 06:37

投稿

tkym_1231
tkym_1231

スコア57

test CHANGED
@@ -1 +1 @@
1
- スレッドセーフな関数定義について
1
+ マルチスレッドでの関数呼び出し
test CHANGED
@@ -1,14 +1,16 @@
1
- ### 前提・発生している問題
1
+ ### 前提
2
2
 
3
3
  c++でマルチスレッドアプリケーションを作成しています。
4
4
 
5
- マルチスレッド処理で、以下のような関数各スレッドからcallしています。
5
+ スレッド、以下のように処理のWrapperクラス持っています。
6
6
 
7
7
 
8
8
 
9
+ 処理クラス
10
+
9
11
  ```c++
10
12
 
11
- float Func(float* buf)
13
+ float Proc(float* buf)
12
14
 
13
15
  {
14
16
 
@@ -22,7 +24,63 @@
22
24
 
23
25
  }
24
26
 
25
- return total;
27
+ return total;
28
+
29
+ }
30
+
31
+
32
+
33
+ class Hoge
34
+
35
+ {
36
+
37
+ public:
38
+
39
+ float ProcessCall(float* buf);
40
+
41
+ };
42
+
43
+ ```
44
+
45
+
46
+
47
+ Wrapperクラス
48
+
49
+ ```c++
50
+
51
+ class Wrapper
52
+
53
+ {
54
+
55
+ public:
56
+
57
+ Wrapper();
58
+
59
+ float Process(float* buf);
60
+
61
+ private:
62
+
63
+ Hoge* hoge;
64
+
65
+ };
66
+
67
+
68
+
69
+ Wrapper::Wrapper()
70
+
71
+ {
72
+
73
+ hoge = new Hoge();
74
+
75
+ }
76
+
77
+
78
+
79
+ float Wrapper::Process(float* buf)
80
+
81
+ {
82
+
83
+ return hoge->ProcessCall(buf);
26
84
 
27
85
  }
28
86
 
@@ -30,14 +88,78 @@
30
88
 
31
89
 
32
90
 
91
+
92
+
93
+ 呼び出し元(スレッド1)
94
+
95
+ ```c++
96
+
97
+ float Th1()
98
+
99
+ {
100
+
101
+ Wrapper* wr;
102
+
103
+ wr = new Wrapper();
104
+
105
+ float buf[256];
106
+
107
+ for(int i=0; i<256; i++)
108
+
109
+ {
110
+
111
+ buf[i] = (float)i;
112
+
113
+ }
114
+
33
- しかし、スレッド1でFuncを呼んでいる間に、スレッド2からFuncが呼ばれると正しく計算されません。
115
+ float ret = wr->Process(buf);
116
+
117
+
118
+
119
+ return ret;
120
+
121
+ }
122
+
123
+ ```
124
+
125
+
126
+
127
+ 呼び出し元(スレッド2)
128
+
129
+ ```c++
130
+
131
+ float Th2()
132
+
133
+ {
134
+
135
+ Wrapper* wr;
136
+
137
+ wr = new Wrapper();
138
+
139
+ float buf[256];
140
+
141
+ for(int i=0; i<256; i++)
142
+
143
+ {
144
+
145
+ buf[i] = (float)i*2.f;
146
+
147
+ }
148
+
149
+ float ret = wr->Process(buf);
150
+
151
+
152
+
153
+ return ret;
154
+
155
+ }
156
+
157
+ ```
34
158
 
35
159
 
36
160
 
37
161
  ### 質問
38
162
 
39
- 上記のような場合、スレッドセーフな良い実装方法どのような方法が考えらるでしょう
163
+ スレッド1がProc関数を処理中に、スレッド2がProc関数を呼んだ場合、正しく計算行わます
40
164
 
41
-
42
-
43
- 上記関数をclass化して各スレッドでnewするしないでしょうか。
165
+ 自分の考えは処理中にポインタの指先が変わので、計算結果が変わってまうのではないかと考えています