• 締切済み

プログラムのマルチスレッド化について。

マルチスレッド化したプログラムの作成を行いたいと思い、 前に作った、スライス画像を作成するプログラムを マルチスレッド化しようと、自分作ってみたのですが、デバック中に エラーで、止まってしまいます。 プログラムはこれです。http://koushi12.if.land.to/main.h この中の、///ここでエラーがでます/// というところで止まってしまいます。 ちょっと長いので、もしお時間ある方いらっしゃっいましたら見ていただき、修正箇所を指摘していただきたいのですが、 プログラム読むほど時間無い方には、質問で答えて頂きたいのですが、 各スレッドに、データ(引数)を渡すところで、 1つのデータ(例えばポインタで作ってある、画像データ)を、2つのスレッドに渡しても大丈夫なのでしょうか? データは、2つ作って、それぞれを、それぞれのスレッドに渡さないとダメなのでしょうか? それと、例えば、出力関数などを1つだけ作ってあったとして、 それを、各スレッドの中で、呼び出して大丈夫でしょうか? 関数も、各スレッドが呼び出しで衝突しないように、2つ作る必要があるのでしょうか? すみませんが、回答よろしくお願いします。

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

ざっとソースを見ました。 かなり突っ込みどころ満載です。 ・エラーの原因。 DATA *data1, *data2;//マルチスレッド用 mallocしてますが値を入れていませんので、この構造体の値は不定です。スレッドが値を参照してちゃんと動くはずがありません。デバッガですぐ分かるはずなので、デバッガのちゃんとした使い方を理解してください。 特にスレッドプログラミングするためには、ちゃんとデバッガを使えるようになっていないとダメです。 ・mallocを使いすぎ。サイズ固定でスタックを大量消費しないならローカル変数で十分。freeを忘れてる変数がありますよ。 mallocは、サイズが可変する場合だけ使いましょう。 ・同じ処理をするのにスレッドのソースコードを分ける必要はありません。 ・2つのスレッドから同時にprintfすると混ざり合ったりして意味不明になります。状況表示したいならプロセス間通信などを使ってメイン側で状況を表示してやりましょう。 ・2つのスレッドから同じファイルに同時open出来るはずがありません。 ・オープンエラーをチェックしていません。 ・今回の処理は、同じデータを2つのスレッドで同時に処理しているだけに見えます。コンパイラやOSがうまく処理してくると思ったら大きな間違いですので、ちゃんと自分で面倒を見ましょう。 総じてスレッド以前にC言語の勉強不足です。知識不足から行ったスレッドの動作設計はスレッドの体をなしていません。 スレッド化する場合の注意点は、 ・入出力(ファイルとメモリ)をスレッド毎に分離すること。 ・CPU使用率100%なスレッドを作って効果があるには、マルチコアなCPUだけです。つまり、速度アップ出来るかは環境しだいです。CPU使用率が低い場合にはどんな環境でもスレッド化である程度の速度アップが期待できます。 ・スレッドセーフとい概念を理解している必要があります。つまり、OSのファイル管理やメモリ管理、プロセス管理をある程度以上理解している必要があります。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

>1つのデータ(例えばポインタで作ってある、画像データ)を、2つのスレッドに渡しても大丈夫なのでしょうか? この場合、排他制御が必要になるでしょう。 下記のサイトの「4. 簡単な排他制御プログラム」などを参考にして下さい。 http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/thread.html >それと、例えば、出力関数などを1つだけ作ってあったとして、 >それを、各スレッドの中で、呼び出して大丈夫でしょうか? スレッドから関数を呼ぶ場合、その関数が「スレッドセーフ」である必要があります。 スレッドセーフでなければ、排他制御が必要です。 (出力関数であれば、おそらくスレッドセーフではないでしょう。) 「スレッドセーフ」については下記など参考にして下さい。 http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%BB%E3%83%BC%E3%83%95 #ソースは読んでません。 #自分が管理しているサイトへのリンクはルール違反ですよ。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

マルチスレッド化するのでしたらデータの分担を考えましょう 2分割なら元データを半分ごと分担するようにします 共通で使う資源があるならクリティカルセクションやミューテックスなどで同期を考えないといけないでしょう スレッド本体は同じ処理なら1つで良いと思いますよ 与えるポインタ引数に どこからどこまでのデータを扱うかといった情報を埋め込みましょう エラーが出るならその内容を具体的に記載しましょう

関連するQ&A