• 締切済み

WaitForSingleObject()でエラー

 初めまして、自分の知識不足で解決できないため、こちらに質問をさせてもらいます。  自分が保守をしているプログラムでエラーが出ているのですが、原因が分からず行き詰っています。  対象のプログラムは、マルチスレッド構成で、プログラム終了時にメインスレッドが他のスレッドをWaitForSingleObject()でチェックして全てのスレッドが終了していたら自分も終了してプログラムを終わらせています。  この時、あるスレッドへのWaitForSingleObject()で「WAIT_FAILED」が返り、GetLastError()で取得したエラーコードが「5:アクセス拒否」でした。  エラー自体も毎回起きるわけではなく、しかも同一の筐体では発生していないので、タイミング的な問題ではないかと考えているのですが、WaitForSingleObject()でこんなエラーが返るのは初めてで、お手上げ状態になっています。  プログラムは、C言語で作成しており、WindowServer2003/VisualStudio2005の環境からWindowsServer2012/VisualStudio2012にリコンパイルして動かしており、2003環境ではおきたことがなく、2012環境になってから発生しています。  チェック先のスレッドも、タイミング的にはスレッドで保持しているメモリをクリアした後に_endthread()を実行しているだけでなのですが、わな掛けとかしたくてもどこにすれば良いのか分からず、ここに質問をさせてもらいました。  どんなヒントでも良いので、アドバイスがあればお願いします。

みんなの回答

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.1

とりあえず、すべてのスレッドの開始・終了のタイミングでログを出してみるとなにかわかるかもしれません。 当てずっぽうでいくつか… ・そのスレッドの起動には成功していますか? ・そのスレッドのハンドルを参照しているのはそこだけですか? ・実行環境はOSが変わっただけですか? マシンも変わりましたか?

subarist0555
質問者

お礼

返信ありがとうございます。 ・スレッド自体の起動は成功しています。そうでないと処理が正しく動かなくなります。 ・他に対象スレッドにアクセス、参照してるのはありません。これは確認済です。 ・OS含めて、マシンの保守期限切れなので新規サーバーを構築しています。 取り敢えず、もうちょっとデバッガ等で内部処理を追えないか確 してみます。

関連するQ&A

  • WaitForSinbleObjectについて

    こんにちは。 現在VC++6.0でスレッドを用いたプログラムを行っています。 GUIでSTARTボタンを押すと、ワーカースレッドが起動し特定量の処理を開始します。(例えば100件のファイルコピーなど) 100件の処理が完了したらワーカースレッドは終了する。 GUIでSTOPボタンを押したときにフラグを立てて、ワーカースレッド内でそのフラグが立っていたら処理を抜けてスレッドを終了させることもできるようにしたいと考えています。 このワーカースレッドの終了のことで疑問があります。 STOPボタンを押してフラグを立てたあとにWaitForSingleObjectでスレッドの終了を待とうと思っていますが、このSTOPボタンを押したタイミングと、100件のファイルコピーが終わりワーカースレッドが自分で終了するタイミングとがかぶってしまった場合、WaitForSingleObjectで待ちに入った時点で、すでにスレッドが終了してしまっている場合が起こりうるのではないかと考えているのですが、実際にどうなのでしょうか? WaitForSingleObject実行時にすでにスレッドが破棄されていた場合、WaitForSingleObjectはどういう値を返すのでしょうか? 事前にスレッド(スレッドのハンドル)が生きているかどうかを調べる方法はあるのでしょうか? ご存知の方教えてください。 わかりづらい説明で申し訳ありません。

  • CSocket通信での待機処理について

    VC++2008にて、サーバとクライアントPCにて、相互通信を行うプログラムを作成しています。 クライアントは、CSocketを利用しマルチスレッドにて通信を行っています。 thread_start→マルチスレッド作成→ CSocket::Sendでサーバへメッセージ送信→ CSocket::OnReceiveでサーバのメッセージ受信→ サーバメッセージから処理実行と言った流れです。 通常の処理は、この流れで問題ないのですが、 ある処理の場合、thread_startをforループで数回繰り返す 処理を行っています。 この時、データにタイムラグが出てしまうため、 thread_startから処理実行までの一連の流れが終了するまで、 次のthread_startは呼ばれずに待機させたいのですが、 どのようにすれば良いのかが分かりません。 Sendを呼んだタイミングで、 WaitForSingleObjectでスレッドのハンドルを渡したり、 CreateEventでイベントハンドルを渡したりしてみたのですが、 WaitForSingleObjectを呼ぶと、OnReceiveで受信する前で 止まってしまうため、そのままフリーズ状態になってしまいます。 どのタイミングでWaitFor~を呼ぶべきなのか、 もしくは、何か別の手段があるのでしょうか?

  • スレッド終了を待つ間に開放されたデータを参照

    MFCのアプリケーションで、 マルチスレッド処理中にユーザがアプリを終了できる場面があります。 スレッドの末尾にフラグを置き、 それがOFFなら抜ける、というコードを書いているのですが、 そこにたどり着くまでに、開放されたデータ等を参照してエラーが発生します。 CMainFrame::OnDestroy() の先頭でフラグをOFFにし、 ::WaitForSingleObject(pThread, INFINITE); を書いたのですが、素通りしているようです。 どうすれば解決できるでしょうか。書く場所が間違っているとすればお手数ですが正しい場所をご指摘ください。

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

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

  • スレッドについて

    スレッドについて勉強中なのですが、簡単なスレッド作り、 スレッドの処理が終わってからメインの処理を行わせたくて 以下のようなプログラムを書いてみました。 そこで、WaitForSingleObjectを使ってスレッドが終了するのを 待ちたいのですが、WaitForSingleObjectではまってしまうようで sprintfのメッセージ(スレッドが止まってしまっている)が 表示されません。 WRITE関数の処理が終われば、、WaitForSingleObjectで処理が 戻ってくると考えているのですが…。 スレッドについてと、間違いについて教えてもらえないでしょうか? 宜しくお願いします。 main { if(!stop) {   File = CreateFile(...); g_hThead = CreateThread(NULL,0,WRITE,(LPVOID)NULL,0,NULL); g_stop = false; }else { g_stop = true; ::WaitForSingleObject(g_hThead, INFINITE); CloseHandle(File); CloseHandle(hThead ); } } void WRITE() { while(!g_stop) { WriteFile(...); } ...処理を行う sprintf("スレッドを終了します。") }

  • スレッドの監視方法

    MFCを使ってマルチスレッドプログラミングを行う予定です。 そこで質問なのですが、皆さんがマルチスレッドのプログラミングを行う際 どのようにしてスレッドの状態を監視していますか? VisualStudio中にスレッドの状態を監視する方法があるのでしょうか? また、スレッドの状態を監視する定番ツールのようなものはあるのでしょうか? 定番ではなくても便利なツールがあったら有料でも構いませんので教えて下さい。 マルチスレッドプログラミングは少ししか経験がありません。 お勧めの書籍などあったら教えて頂けると助かります。 どうぞ宜しくお願い致します。 環境:WindowsXP + VS6のMFC(後にVS2100使用予定)

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

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

  • sem_wait というエラーについて

    こんばんは、今javaでのマルチスレッドを使ったアプリを作っているのですが、ごくまれに以下のようなエラーが発生し、アプリケーションが強制終了してしまいます。色々と調べてみたのですが、どうやっても答えが見つからないため、大変申し訳ございませんが皆様のお力をお借りできればと思いご質問させて頂きました。 エラーが発生すると以下のメッセージが出力されます。 Sem_wait returned -1 sem_wait for handler failed Aborted 環境はlinux+j2sdk1.4.2です。これが何を意味しているエラーなのかだけでも分かれば良いのですが、原因が不明のため、もし宜しければご教授頂ければ幸いです。宜しくお願いいたします。

  • VC++のサービスプログラム

    現在、VC++でサービスプログラムを作成しています。 メインプロセスから3つのスレッドを起動後、終了イベントをCreateEvent()で生成し、そのイベントをWaitForSingleObject()でプログラムの終了待ちをしているのですが、サービス起動後、エクスプローラを開いたりすると画面が一定時間フリーズし応答がなくなってしまします。 この事象の原因がわかる方いますでしょうか? ちなみにWaitForSingleObject()はINFINITEでしていしています。 また、画面のフリーズは放っておくと一定時間で解除されます。

  • ファイルを開けたときに発生するエラー

    2年前にCDにデータを落としたテキストファイルを開こうとしたら以下のエラーメッセージが表示されました。 "ファイルの読み取りに失敗しました。GetLastError()==87 パラメータが間違っています" windows2000の環境でも出ますが,WindowsXpでも発生します。ファイルがつぶれているのでしょうか?

専門家に質問してみよう