• ベストアンサー

セマフォの使用例を教えてください。

noname#30727の回答

  • ベストアンサー
noname#30727
noname#30727
回答No.1

WIN32APIでいいのかな? まずは、Mutexについてですが、あらかじめ、 HANDLE mutex = CreateMutex(NULL, FALSE, NULL); と作成した、ミューテックスオブジェクトがあるとします。 void AccessFile() {  WaitForSingleObject(mutex, INFINITE);  CreateFile(...);  WriteFile(...);  CloseHandle(...);  ReleaseMutex(mutex); } 複数のスレッドから、AccessFileを同時に呼び出しても、WaitForSingleObjectから戻ってくるスレッドは1だけになります。その他のスレッドは戻ってきません。WaitForSingleObjectを通過したスレッドが、ReleaseMutexを呼び出せば、その他のスレッドのどれか1つがWaitForSingleObjectの呼び出しから戻ってきます。 で、セマフォの場合はどうなのかというと、 HANDLE semaphore = CreateSemaphore(NULL, 4, 4, NULL); // 4つまで通過できるとする void AccessFile() {  WaitForSingleObject(semaphore, INFINITE);  ...  ReleaseSemaphore(semaphore, 1, NULL); } 同様に、複数のスレッドから、AccessFileを同時に呼び出した場合、WaitForSingleObjectから戻ってくるスレッドは4つが最大になります。この場合、なんらかのリソースが4つ存在するから、4つのスレッドが通過できるというようにするのですが、実際にどのリソースが使用可能かは、セマフォとは別に作成してやる必要があります。

COPY_ROBOT4
質問者

お礼

細かく教えていただいてありがとうございました。 とっても助かりました。少し前に進むことができました でも、難しいですね。仕様を考え初めてもう、4日も立つのにまだ半信半疑です。inthefloiさんの回答を何回も読み直してがんばります。どうもありがとうございました。

関連するQ&A

  • Linuxのgccでセマフォをやりたい。

    gccプログラムでマルチタスクのプログラミングをやっています。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2433/trunk/20140411/main.c 以前、H8マイコンに組み込みOSを使用した際に、複数のタスクを動作させている際に、各タスクがwhile(1)で永久ループの状態をしている際に、その永久ループを一時停止するためのロック・アンロック専用のタスクを1つ作って、各タスクのロック・アンロックして動作を制御することをやったことがありました。 確かロックの場合はSempend();というので、アンロックというのはSempost();という物だったと思いました。 例えばTASK1,TASK2,TASK3という3つのタスクを作成し、それぞれを制御したい場合は、 例えばTASK1のセマフォをアンロックしたい場合は Sempost(LockTask1); このようにしたらTASK1が動作し始め、ロックしたい場合はSempend(LockTask1);というようにしたいと思います。 次の例のようなセマフォ制御をLinuxのgccのセマフォプログラミングで行うことは可能でしょうか? どうぞ、ご教示頂きますようお願い致します。 (例) //タスクセマフォ制御用タスク TASK_SEM_CTL() { while(1) { Sempost(LockTask1); delay(1000) //1sec wait Sempost(LockTask2); delay(1000) //1sec wait Sempost(LockTask3); delay(1000) //1sec wait } } TASK1 { while(1) { Sempend(LockTask1); printf("TASK1_done"); Sempost(LockTask1); } } TASK2 { while(1) { Sempend(LockTask2); printf("TASK2_done"); Sempost(LockTask2); } } TASK3 { while(1) { Sempend(LockTask3); printf("TASK3_done"); Sempost(LockTask3); } }

  • 書き込み先のメディアは使用不可能です

    OSはXPでクローンCD4の質問ですが データCDのバックアップを取ろうとしましたが (CDへの書き込みに失敗しました MEDIUM ERROR POWER CALIBRTIONN AREAERROR 3.0x73.0x03) 又 書き込み先のメディアは使用不可能です と出ます買って来たばっかしなのですが クローンCDの画面上では読み込みが終わって 書き込みが始まるとすぐ上記のメッセージが でます. 宜しくお願いします。

  • ロックファイルの必要性

    あるデータを登録したり検索したりするプログラムを作ってます。 データの登録は決まった人しかやらないので、 ファイルへのデータの書き込みもその人だけです。 検索は複数の人がするので、ファイルの読み込みは頻繁にあります。 この場合ファイルの書き込みの時に、ロックファイルは必要でしょうか? ファイルに書き込んでいるときに、 他の人が読み込みだけ行ってもファイルの破損はあるのでしょうか?

    • 締切済み
    • CGI
  • ファイルの排他について

    windows2000でDOSコマンドのcopyを使って ファイルをコピーをしようとしています。 コピー元のファイルが使用中(書き込み中)のときは ロックをかけるようなコマンドか引数はあるのでしょうか? 今は、普通に copy fileA fileB とやった場合、fileAが書き込み中でも 途中までの状態でコピーされてしまいます。 なにか良い対策を教えて下さい。

  • DVD:使用領域、空き領域ともに0バイトと表示されます。

    「DVD ドライブ」で右クリック、プロパティを押すと、 使用領域、空き領域ともに0バイトと表示されます。 また同時に、ファイルシステム:不明 とも表示されます。 しかし、DVDへのデータの書き込み&読み込みは無事できます。 なぜでしょう? 不安でたまりません。

  • パソコンのBDドライブが急に使用不能になりました

    NECのVN770のBDドライブが使用不能になりました。データを録画しようと新しいBDを入れて書き込みするとすぐにドライブが使用できないとでて書き込めません。BD再生はできますし、パソコンとしてドライブの読み込みはできています。デバイスドライブからドライバー削除再立ち上げしても出来ません。何か対処方法ありますでしょうか?やはり故障でしょうか、教えてください

  • どういう時にテーブルロックを使用するのでしょうか

    PHPのサンプルにテーブルロックがあったのですが、 使いどころが分からないので、教えてください。 どういう時にテーブルロックを使用するのでしょうか。 サンプルの解説だと、 「LOCK TABLES」構文を使って会員と管理者が同時に実行する可能性がある更新と削除で テーブルをロックします、 とあるのですが、 例えば、:INSERTとかでは、テーブルをロックしなくてよいのでしょうか? これまで、気にしたことはなかったのですが、 例えば、(テーブルロックをしていない)掲示板で、たまたま同時に書き込みをしたり、しても、特に問題ないのでしょうか? どういう時に、テーブルロックをして、 どういう時にテーブルロックをしなくてよいか、分かりません。 例えば、同じ掲示板の機能を保持するサイトが複数あった場合、 テーブルロックというのは、 大体、処理別でこういう風にする、と決まっているようなものなのでしょうか? あるいは、データの持ち方によって、 それこそサイト毎に、実装(どこでロックするか等)はそれぞれ変わってくるようなものなのでしょうか?

    • ベストアンサー
    • MySQL
  • DVD X COPY コピーソフト

    DVD X COPYを使用してるのですが、データを取り込んでそのデータを保存して何枚も焼きたいのですがやり方がわかりません。データ取り込み→空のメディア挿入→書き込み の流れではコピーできているのですが、一枚しか焼けないので不便です。パソコンは詳しいほうじゃないので教えてください!

  • Perlでロック不具合?

    Perlを使用して、掲示板のようなものをつくり、ずっと稼動させていましたが、 今日、データが消えてしまいました。 データのファイルサイズがゼロになっていました。 ファイルの書込み時には、flockを使用してロックをかけています。 #--ロック flock LOCK,2; #--アンロック flock LOCK,8; どのような原因が考えられますでしょうか? flockが使用できることは、別途スクリプトを作って確認済みです。 環境 SuSE linux 9 Perl v5.8.3 書込みが最大で1日に30件程度 宜しくお願いします。

    • ベストアンサー
    • Perl
  • XMLについてメリットの具体例(まったくの初心者)

    XMLがWEBの理想のように書籍やインターネットで書かれていますが、どのように便利になるか実感が いまいちわかりません。 たとえば、データをXMLで記述すると、コンバートに困らないとか 簡単なレベルで具体例があれば理解できるのですが、 私がXMLで便利になることで、こうできれば便利だと思いますが、 まったく当て外れでしたらご指摘ください。 <record> <field1>りんご</field1> <field2>1</field2> </record> <record> <field1>車</field1> <field2>20000</field2> </record> <record> <field1>お酒</field1> <field2>12</field2> </record> これを以下のファイルをなんらかの操作で作成することはXMLで可能でしょうか? COPY "syohin" FROM stdin; りんご 100 車 2000000 お酒 1200 \. -- -- ドル単位から円単位に変換し、おまけにPostgreSQLのCOPYコマンド -- でインポートできるようなテキストを作成する。 -- まったくXMLを理解していなくて申し訳ございません。

    • ベストアンサー
    • XML