• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マルチスレッドの同期方法)

マルチスレッドの同期方法

このQ&Aのポイント
  • マルチスレッドの同期方法について詳しく教えてください。
  • マルチスレッドの同期には、ミューテックスやセマフォを使用しますが、この問題を解決する方法がわかりません。
  • WinXpとVC2005を使用して、マルチスレッドの同期方法を実装したいです。ご教授いただけると幸いです。

質問者が選んだベストアンサー

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

イベントオブジェクトを使えば解決できると思います。 参考↓ http://nienie.com/~masapico/api_CreateEvent.html http://www.kumei.ne.jp/c_lang/sdk/sdk_89.htm この仕様で作る場合には、PulseEventとSetEventをうまく組み合わせる必要がありますね。 http://nienie.com/~masapico/api_PulseEvent.html http://nienie.com/~masapico/api_SetEvent.html

qOat
質問者

お礼

返答遅れました。すいません。 仕様道理動作するものができました。 SetEventを五本それぞれのスレッドの最後に配置し、その直後に一本のスレッドのほうがSetEventできるEventObjectを置くことで、解決しました。結局EventObjectは6つ使用したことになります。 ただ、一本の方のスレッドの処理が一瞬なので、SetEventを処理したと直後にResetEventを処理しても間に合わず、デッドロックしてしまいます(今のところSleepさせて回避させています。)が、これは今後の課題としてとっておきます。 返答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マルチスレッド間でデータ交換をする方法

    マルチスレッドの知識がないままに、プログラミングをする必要が出てしまったのですが、書籍などで調べても分からない部分があるため、質問いたします。 Win32APIを用いて(MFCは使用しない)、WindowsでVC7.0環境です。 やりたいことは、 スレッドAとスレッドBを生成し、 スレッドAの終了時点で、スレッドBがスレッドA内部で生成したクラスのインスタンスを取得するというものです。(もしくはその逆) スレッドAとB自体もクラスで構成しており、内部で生成されるインスタンスはグローバルではないため、スレッドBからスレッドAを見えるような仕組みが必要なのでしょうか?? まだイメージだけの段階で、ソースコードで表現できなくて申し訳ないのですが、簡単にご教授くださる方、もしくは参考になるサイトを教えてくださる方がいらっしゃいましたら、お願いいたします!

  • マルチスレッドの動作停止について質問なんですが

    マルチスレッドの動作停止について質問なんですが 現在、C++とDirectXを使用してマルチスレッドプログラムを作成しているのですが、 どういう訳かプログラムそのものが動作停止を起こしてしまいます 状況としては 1、マルチスレッドは初期の読み込み時にのみ使用していて、毎回同じものを同じ順番で読み込んでいる。 2、読み込んでいるものは3Dモデル、2D画像の二つ 3、毎回動作を停止する訳ではなく、3~4回に1回の割合で停止する 4、動作を停止している位置を調べてみると毎回違う箇所で動作を停止している 5、スレッドセーフで作っており、デッドロック等は起こっていない 6、エラーは例外は出ない 以上の状況で、プログラムの停止する可能性のある原因について心当たりがある方がいれば教えていただきたいです

  • マルチスレッドのデバッグ

    Eclipseでマルチスレッドプログラミングをしています。 アプリケーションの特性上スレッド数が非常に多く、普通に実行すると稀にデッドロックが起きるが、デバッグの手順によってはそのバグが表れなかったりして、自分自身が効率良くデバッグを行えていない気がします。 Eclipseでデバッグをするにあたり、何か知っておくと便利な機能等ありますか? 現在はスレッドを全て停止して、ちまちまと1つずつStep in/over しています。 オブジェクトの待機プールにどのスレッドが入っているかを知りたいのですが、知る方法ってあるでしょうか?

    • ベストアンサー
    • Java
  • タイマー関数とマルチスレッドについて

    こんばんわ。 マルチスレッドプログラミングを行なっています。 コンパイラはVC++.NETでC言語を利用しwin32 apiを用いています。 スレッドを_beginthreadex関数でスレッドを2つ生成し、WaitForSingleObject,SetEvent,ResetEvent関数によるイベント同期を利用し、2スレッドの同期をはかっています。 [質問内容] 以下のように、スレッド2でWaitForSingleObject関数にてスレッド2を待機状態にし、スレッド1のSetEvent関数にて待機しているスレッド2を再開させる方法をとっています。 例えば、タイマーをスタート後に待機状態になり、スレッド2が再開後タイマーストップするとした場合、スレッド2が待機状態のときもタイマーを動き続けているのでしょうか? ・スレッド1 SetEvent(hEvent[0]); ・スレッド2 SUSPEND_INTERVAL=20 if(Num%THREAD_SUSPEND_INTERVAL==0){ timestart=timeGetTime();←タイマースタート WaitForSingleObject(hEvent[0],INFINITE); ResetEvent(hEvent[0]); timestop=timeGetTime();←タイマーストップ } よろしくお願いします。

  • マルチスレッドについて

    現在”猫でもできる”の87、88章を学んでおります。 まず87章でマルチスレッドの根本的なやり方を学びましたが、いきなり疑問が浮かびました。 _beginthread関数によりスレッドをスタートさせ、この関数で登録した関数内で_endthread関数を実行し終了させていることは分かります。 しかし_beginthread関数で登録した関数に引数を渡す処理がどの部分で行われているのかわかりません。 登録する関数はvoid型で引数はvoid*型でなければいけないことは分かったのですが、プログラムのどこを見てもこの登録した関数に引数を渡す処理が行われていません。 その辺の動作の説明を分かる方でいいのでよろしくお願いします。 そして88章では排他制御のマルチスレッドを行うプログラムの製作を行っているのですが、ちょっとした疑問が浮かびました。 EnterCriticalSection関数、LeaveCriticalSection関数ではさまれたプログラムは排他制御され他からアクセスされない。 この関数はこんな理解で良いんですかね? この理解で行くと、88章で説明していきますが、子ウィンドウを2つ作成しそれぞれのプロシージャ内で排他制御された関数をスレッドとしてスタートしています。 この2つのスレッドの動作についてですが、互いに排他制御関数が記述されているため、動作としてはまず左の子ウィンドウのスレッドが処理されている場合、右の子ウィンドウのスレッドは停止している。そして左の子ウィンドウのスレッドの排他制御が解放されたときに、右の子ウィンドウのスレッドが開始する。 そしてあるとき左の子ウィンドウのクライアントウィンドウ内で右クリックされた場合、その時点で排他制御されたスレッドが終了するのを待ち、終了したらcountを+1する。 こんな動作が行なわれていると理解してよいのでしょうか?

  • マルチスレッドでのDirectXの使用について質問なのですが

    マルチスレッドでのDirectXの使用について質問なのですが 現在_tWinMain内でゲーム用スレッドを登録して スレッド内でDirectXの初期化と解放を行っています それでプログラム終了の際に Direct3D9: (ERROR) :Final Release for a device can only be called from the thread that the device was created from. と出て悩んでいます。 googleで調べてもそれらしいところが見当たらないので困ってます・・・ 解決方法があればぜひよろしくお願いします。

  • マルチスレッドの疑問点と配列について

    こんばんわ。 VC++.NET2003を用いて、C言語プログラミングを行っています。以下に質問内容をまとめます。 1.現在、マルチスレッドを行っています。マルチスレッドの注意点として、 ・スレッドが複数同時に処理(現在2スレッド)され、それぞれのスレッドで同一のグローバル変数をアクセスする。 ・各スレッドで使用しているスタティック変数はプロセスとして1つの領域に確保される。 と記述されていました。 現在、2スレッド動かしているのですが、2スレッド共通で使用したい変数がある場合は、グローバル変数として宣言してよいのでしょうか? スタティック変数というのは、 static int i を指すのでしょうか・・・・初心者的発言で申し訳ありません。 次にもう一つ質問させていただきます。 配列を整数型で10000要素、静的に用意します。 これを、memset関数ですべての番地に0を初期値として入れておきます。 たとえば、9000という数字があった場合、9000番に整数値9000を格納する。また、56では56番に56を格納する。 そして、最終的に10000要素を走査し0の場所をカウントする。 ということは可能でしょうか?もしよろしければ、サンプルを教えていただきたいと思っています。 よろしくお願い致します。

  • C++ シングルトン マルチスレッド

    標準C++でシングルトンを実装したいのですが。 class Singleton{ public: static Singleton* getInstance(){ if (_instance == NULL){ //スレッドAがこの時点で、スレッドBがNULLチェックすると破綻する _instance = new Singleton(); } return _instance; } private: Singleton(); static Singleton* _instance; }; マルチスレッドになると上記のパターンで破綻するといわれどうしたものかと考えております。 static Singleton* _instance = new Singleton(); と出来れば解決なのですが 「static const int データメンバ以外をクラス内で初期化することはできません」 とのことでそれもできず。 どのようにすればよいでしょうか。

  • マルチスレッドでブレイクポイントするとフリーズする

    C++/CLI .Net2008 windowsフォームアプリケーション 二つのスレッドが同時に動いているマルチスレッドプログラムを作成しています。 デバッグでブレイクポイントを張って途中で止めたいのですが、止めてすぐもしくはF10で2,3行進めるとフリーズしてアプリが動かなくなってしまいます。他のoutlook等も動かせず、タスクマネージャも開かないため、画面下のウィンドウを右クリック、閉じるを5~10分くらいかけて行って終了させています。たまにVisualStudio自体もフリーズして落ちることがあります。 ブレイクポイントで止めなければフリーズはしません。 プログラムの構成としては、 片方は外部装置からリアルタイムでデータを受信し、判別した結果を出力するスレッドと、その判別結果を元に状態を遷移させるスレッドです。 また、状態によってはタイマーを設けている箇所があり、タイマー処理もスレッドで行っています。 ブレイク張らずに実行した時におかしい動作をしている箇所があるので1行ずつ見たいのですが、マルチスレッド環境ではフリーズするものなのでしょうか?

  • マルチスレッドを実現したい

    VB6.0でマルチスレッドを実現する方法ってないのでしょうか? DoEventを使用するとどうしても現在実行しているスレッドを途中で停止して別のスレッドを実行し終わってから再び最初のスレッドに処理が戻るっていうふうになってしまいます…。 そうではなくて、あたかも二つの処理が同時に進んでいるように見せかけることってできないのでしょうか? <例> リストボックス1とリストボックス2があってそれぞれに大量のデータをAddItemしていく処理の時、はじめリストボックス1のAddItemの処理が実行されているとして途中からリストボックス2の方にもAddItemに処理を行おうとした時、リストボックス1のAddItem処理がすべて終了してからリストボックス2のAddItem処理を行うのではなく、あたかも二つ同時にAddItem処理がされているようにする…といった感じです。 VB6.0ではとても困難なことだと分かっていますが、どなたか分かる方おられたら教えて下さい、よろしくお願いします。 ”こんなのはどう??”なんて意見でも嬉しいです。