• ベストアンサー

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

こんにちは。COPY_ROBOT4です。 現在、VCのセマフォの使用例を今探しています。MSDNを見たのですが、文章で書いてあるだけで、実際どのように書いたらいいのか分かりません。どうか知っている知識を少し分けてください。 【セマフォをどのように使いたいか】 データ書き込み中、読み込み中にも関わらず、またデータ書き込み、読み込みをしないように、最中はロックをしたいと考えています。 この場合、どうすればいいですか?どうか使用例を教えて下さい。 また、お勧めサイトがあったら是非教えて下さい。 何もかも、聞いてしまって申し訳ないです。お願いします。

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

  • ベストアンサー
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