質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
並列処理

複数の計算が同時に実行される手法

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2168閲覧

マルチスレッドでの関数呼び出し

tkym_1231

総合スコア57

並列処理

複数の計算が同時に実行される手法

スレッドセーフ

マルチスレッド環境において、複数のスレッド上で常に正常に実行する事が可能なコードを、スレッドセーフなコードと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/05/25 05:17

編集2021/05/25 07:29

前提

c++でマルチスレッドアプリケーションを作成しています。
各スレッドは、以下のように処理のWrapperクラスを持っています。

処理クラス(DLLとして実装)

c++

1float Proc(float* buf) 2{ 3 float total = 0.f; 4 for(int i=0; i<256; i++) 5 { 6 total += buf[i]; 7 } 8 return total; 9} 10 11class Hoge 12{ 13public: 14 Hoge(); 15 float ProcessCall(float* buf); 16}; 17Hoge::Hoge() 18{ 19 20} 21 22float Hoge::ProcessCall(float* buf) 23{ 24 return Proc(buf); 25} 26 27static Hoge s_hoge; 28 29float process(float* buf){return s_hoge.ProcessCall(buf);}

Wrapperクラス

c++

1class Wrapper 2{ 3public: 4 float Process(float* buf); 5}; 6 7float Wrapper::Process(float* buf) 8{ 9 return process(buf); 10}

呼び出し元(スレッド1)

c++

1float Th1() 2{ 3 Wrapper* wr; 4 wr = new Wrapper(); 5 float buf[256]; 6 for(int i=0; i<256; i++) 7 { 8 buf[i] = (float)i; 9 } 10 float ret = wr->Process(buf); 11 12 return ret; 13}

呼び出し元(スレッド2)

c++

1float Th2() 2{ 3 Wrapper* wr; 4 wr = new Wrapper(); 5 float buf[256]; 6 for(int i=0; i<256; i++) 7 { 8 buf[i] = (float)i*2.f; 9 } 10 float ret = wr->Process(buf); 11 12 return ret; 13}

質問

スレッド1がProcess関数を処理中に、スレッド2がProcess関数を呼んだ場合、正しく計算は行われますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/05/25 05:21

> スレッド1でFuncを呼んでいる間に、スレッド2からFuncが呼ばれると正しく計算されません。 それは本当ですか? Func()はbuf[0]~[255]の内容を読み出しているだけなので競合しないように見えますが。bufの内容を上書きしている別のスレッドが居るのではないですか?
tkym_1231

2021/05/25 07:37

ご指摘の通り、bufの内容を上書きしている処理がありました。 間違いに合わせて質問内容も修正させていただきました。
fana

2021/05/25 07:48

呼び出し側に関する情報が増えたみたいですが, Th1() と Th2() とでは全く別のバッファを扱っているわけですから,やはり問題が発生するようには見えません.
dodox86

2021/05/25 08:02

あれれ、確かに、質問内容が変わり、論点が変わったようですね。「提示のコードで正しく動くでしょうか?」と言う質問でしょうか。「処理クラス(DLLとして実装)」でHogeクラスが実装されて、static Hoge s_hoge;と単一のものになっていますが、HogeクラスとWrapperクラスを分ける必要があるのでしょうか。ちょっと見通しが悪いような。(<個人の意見です) 何となく大丈夫そうにも思えますが、呼び出し側で起動(start)したスレッドをjoinするような部分も見当たりませんし、判断つきかねるところです。実際にスレッドとして起動する際に使うのがstd::threadなのか、pthreadであったりWin32 Threadであったりするのか。
guest

回答1

0

ベストアンサー

その関数自体の問題ではなく,それを呼んでいる側の問題であろうと思われます.


質問が変わったようなので.

スレッド1がProcess関数を処理中に、スレッド2がProcess関数を呼んだ場合、正しく計算は行われますか?

Process関数に渡したバッファが別のスレッドでいじくり回されているような場合には問題があるでしょうけども,
質問に提示されたコードではそのようなことになっていないので,正しい計算が成されるでしょう.

投稿2021/05/25 05:19

編集2021/05/25 07:50
fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問