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

質問編集履歴

7

誤字を修正

2021/05/25 07:29

投稿

tkym_1231
tkym_1231

スコア57

title CHANGED
File without changes
body CHANGED
@@ -85,4 +85,4 @@
85
85
  ```
86
86
 
87
87
  ### 質問
88
- スレッド1がProc関数を処理中に、スレッド2がProc関数を呼んだ場合、正しく計算は行われますか?
88
+ スレッド1がProcess関数を処理中に、スレッド2がProcess関数を呼んだ場合、正しく計算は行われますか?

6

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

2021/05/25 07:29

投稿

tkym_1231
tkym_1231

スコア57

title CHANGED
File without changes
body CHANGED
@@ -4,6 +4,16 @@
4
4
 
5
5
  処理クラス(DLLとして実装)
6
6
  ```c++
7
+ float Proc(float* buf)
8
+ {
9
+ float total = 0.f;
10
+ for(int i=0; i<256; i++)
11
+ {
12
+ total += buf[i];
13
+ }
14
+ return total;
15
+ }
16
+
7
17
  class Hoge
8
18
  {
9
19
  public:

5

質問内容を修正

2021/05/25 07:28

投稿

tkym_1231
tkym_1231

スコア57

title CHANGED
File without changes
body CHANGED
@@ -4,27 +4,25 @@
4
4
 
5
5
  処理クラス(DLLとして実装)
6
6
  ```c++
7
- float Proc(float* buf)
8
- {
9
- float total = 0.f;
10
- for(int i=0; i<256; i++)
11
- {
12
- total += buf[i];
13
- }
14
- return total;
15
- }
16
-
17
7
  class Hoge
18
8
  {
19
9
  public:
10
+ Hoge();
20
11
  float ProcessCall(float* buf);
21
12
  };
13
+ Hoge::Hoge()
14
+ {
22
15
 
16
+ }
17
+
23
18
  float Hoge::ProcessCall(float* buf)
24
19
  {
25
20
  return Proc(buf);
26
21
  }
27
22
 
23
+ static Hoge s_hoge;
24
+
25
+ float process(float* buf){return s_hoge.ProcessCall(buf);}
28
26
  ```
29
27
 
30
28
  Wrapperクラス
@@ -32,20 +30,12 @@
32
30
  class Wrapper
33
31
  {
34
32
  public:
35
- Wrapper();
36
33
  float Process(float* buf);
37
- private:
38
- Hoge* hoge;
39
34
  };
40
35
 
41
- Wrapper::Wrapper()
42
- {
43
- hoge = new Hoge();
44
- }
45
-
46
36
  float Wrapper::Process(float* buf)
47
37
  {
48
- return hoge->ProcessCall(buf);
38
+ return process(buf);
49
39
  }
50
40
  ```
51
41
 

4

情報を追加

2021/05/25 07:27

投稿

tkym_1231
tkym_1231

スコア57

title CHANGED
File without changes
body CHANGED
@@ -2,7 +2,7 @@
2
2
  c++でマルチスレッドアプリケーションを作成しています。
3
3
  各スレッドは、以下のように処理のWrapperクラスを持っています。
4
4
 
5
- 処理クラス
5
+ 処理クラス(DLLとして実装)
6
6
  ```c++
7
7
  float Proc(float* buf)
8
8
  {

3

文言を修正。

2021/05/25 06:48

投稿

tkym_1231
tkym_1231

スコア57

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

2

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

2021/05/25 06:40

投稿

tkym_1231
tkym_1231

スコア57

title CHANGED
File without changes
body CHANGED
@@ -19,6 +19,12 @@
19
19
  public:
20
20
  float ProcessCall(float* buf);
21
21
  };
22
+
23
+ float Hoge::ProcessCall(float* buf)
24
+ {
25
+ return Proc(buf);
26
+ }
27
+
22
28
  ```
23
29
 
24
30
  Wrapperクラス

1

質問内容を全体的に修正

2021/05/25 06:37

投稿

tkym_1231
tkym_1231

スコア57

title CHANGED
@@ -1,1 +1,1 @@
1
- スレッドセーフな関数定義について
1
+ マルチスレッドでの関数呼び出し
body CHANGED
@@ -1,22 +1,83 @@
1
- ### 前提・発生している問題
1
+ ### 前提
2
2
  c++でマルチスレッドアプリケーションを作成しています。
3
- マルチスレッド処理で、以下のような関数を各レッドからcallしています。
3
+ スレッド、以下のように処理のWrapperクラを持っています。
4
4
 
5
+ 処理クラス
5
6
  ```c++
6
- float Func(float* buf)
7
+ float Proc(float* buf)
7
8
  {
8
9
  float total = 0.f;
9
10
  for(int i=0; i<256; i++)
10
11
  {
11
12
  total += buf[i];
12
13
  }
13
- return total;
14
+ return total;
14
15
  }
16
+
17
+ class Hoge
18
+ {
19
+ public:
20
+ float ProcessCall(float* buf);
21
+ };
15
22
  ```
16
23
 
24
+ Wrapperクラス
25
+ ```c++
26
+ class Wrapper
27
+ {
28
+ public:
29
+ Wrapper();
17
- しかし、スレッド1でFuncを呼んでいる間に、スレッド2からFuncが呼ばれると正しく計算されません。
30
+ float Process(float* buf);
31
+ private:
32
+ Hoge* hoge;
33
+ };
18
34
 
35
+ Wrapper::Wrapper()
36
+ {
37
+ hoge = new Hoge();
38
+ }
39
+
40
+ float Wrapper::Process(float* buf)
41
+ {
42
+ return hoge->ProcessCall(buf);
43
+ }
44
+ ```
45
+
46
+
47
+ 呼び出し元(スレッド1)
48
+ ```c++
49
+ float Th1()
50
+ {
51
+ Wrapper* wr;
52
+ wr = new Wrapper();
53
+ float buf[256];
54
+ for(int i=0; i<256; i++)
55
+ {
56
+ buf[i] = (float)i;
57
+ }
58
+ float ret = wr->Process(buf);
59
+
60
+ return ret;
61
+ }
62
+ ```
63
+
64
+ 呼び出し元(スレッド2)
65
+ ```c++
66
+ float Th2()
67
+ {
68
+ Wrapper* wr;
69
+ wr = new Wrapper();
70
+ float buf[256];
71
+ for(int i=0; i<256; i++)
72
+ {
73
+ buf[i] = (float)i*2.f;
74
+ }
75
+ float ret = wr->Process(buf);
76
+
77
+ return ret;
78
+ }
79
+ ```
80
+
19
81
  ### 質問
20
- 上記のような場合、スレッドセーフな良い実装方法はどのような方法考えられるでょう
82
+ スレッド1がProc関数を処理中に、スレッド2Proc関数を呼んだ場合、正く計算は行われます
21
-
22
- 上記関数をclass化して各スレッドでnewするしかないでしうか。
83
+ 自分の考えは処理中にポインタの指先が変わ、計算結果が変わってのではないと考えています