前提
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関数を呼んだ場合、正しく計算は行われますか?
> スレッド1でFuncを呼んでいる間に、スレッド2からFuncが呼ばれると正しく計算されません。
それは本当ですか? Func()はbuf[0]~[255]の内容を読み出しているだけなので競合しないように見えますが。bufの内容を上書きしている別のスレッドが居るのではないですか?
ご指摘の通り、bufの内容を上書きしている処理がありました。
間違いに合わせて質問内容も修正させていただきました。
呼び出し側に関する情報が増えたみたいですが,
Th1() と Th2() とでは全く別のバッファを扱っているわけですから,やはり問題が発生するようには見えません.
あれれ、確かに、質問内容が変わり、論点が変わったようですね。「提示のコードで正しく動くでしょうか?」と言う質問でしょうか。「処理クラス(DLLとして実装)」でHogeクラスが実装されて、static Hoge s_hoge;と単一のものになっていますが、HogeクラスとWrapperクラスを分ける必要があるのでしょうか。ちょっと見通しが悪いような。(<個人の意見です) 何となく大丈夫そうにも思えますが、呼び出し側で起動(start)したスレッドをjoinするような部分も見当たりませんし、判断つきかねるところです。実際にスレッドとして起動する際に使うのがstd::threadなのか、pthreadであったりWin32 Threadであったりするのか。
回答1件
あなたの回答
tips
プレビュー