- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プログラムの排他制御)
プログラムの排他制御について
このQ&Aのポイント
- WindowsXP VC++でプログラムを組んでいる際、同時に起動されても並列で動くのを避けたい場合、後から起動された方は先に起動された方が終了するのを待つ仕組みを作りたいと考えています。
- 実行中のプロセスを確認し、同じ名前のプロセスが存在する場合は、数秒ウェイトをかけた後に再度プロセスをチェックするループ処理を実装する予定です。
- しかし、複数のプロセスがほぼ同時に起動した場合、お互いが終了を待ち合わせるデッドロック状態になる可能性があります。適切な解決方法を探しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
簡易版 1. 名前付きのオブジェクトを作成します。名前付きオブジェクトは、同じ名前で複数作成することができないので、作成に成功したプロセスが「最初に起動したプロセス」、作成に失敗したプロセスが「2回目以降に起動したプロセス」と分かります。 2. オブジェクト作成に成功したプロセスは、必要な処理を行い、終了したらオブジェクトを削除します。 3. オブジェクト作成に失敗したプロセスは、オブジェクトが作成できるまで何度も試みます。 4. 「最初に起動したプロセス」がオブジェクトを削除すると、「2回目以降に起動したプロセス」のどれか1つだけがオブジェクトの作成に成功します。これ以降は2.以下の処理を繰り返します。 「2回目以降に起動したプロセス」が複数ある場合、上記4.ではそのうちどのプロセスがオブジェクト作成に成功するか定かではないので、完全に起動した順番に実行されるわけではありません。その辺が「簡易版」たるゆえんです。
その他の回答 (2)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
回答No.3
3.の「何度も試みる」はあまり効率が良くないので、オブジェクト作成を待つかわりに、名前付きミューテックスなり名前付きセマフォなりを「開いて」(開くだけなら多数のプロセスで同時にできる)、その「取得」ができるのを待つほうが一般的かも。 実行順序については回答No.2と同じく、2番目以降は不定になります。
質問者
お礼
丁寧にありがとうございました。 重ねて御礼申し上げます。
- jacta
- ベストアンサー率26% (845/3158)
回答No.1
ファイバーを使うと比較的簡単になるかと思います。
質問者
お礼
回答ありがとうございます。 ファイバーというのがなんなのか、検索しても光ファイバーしか出てこなかったのでいまだにわかっていませんが。。。
お礼
回答どうもありがとうございました! この説明の時点では「名前付きオブジェクト」などで検索してもうまく見つけることが出来なかったのですが、 #3の中でmutexとかが出てきたので、検索してサンプルソースなどを入手することができました。 本当にありがとうございました! また何かありましたら、よろしくお願いします。