【セマフォ】非同期処理を並行して実行させたくない時【semaphore】

【セマフォ】非同期処理を並行して実行させたくない時【semaphore】

人工知能と機械学習の人気オンライン講座

ながれです。

 

今回は、非同期処理を並行して実行させたくない場合についてお話します。

例えば、処理Aと処理Bは非同期で動く処理だとします。

しかし、処理Aが動いている間は処理Bを動かしたくない場合ですね。

 

そんな時に使えるのが「セマフォ」と呼ばれる仕組みです。

 

ではそもそもセマフォとは何か?お話していきます!

「セマフォとは?」

排他制御のための仕組みで、同時に幾つの処理が動けるか制御できます。

ある資源が何個使用可能かを示す記録のことです -Wikipediaより

例えば、先ほどと同様に処理Aと処理Bは非同期で動くもので、同時には動かしたくない処理だとします。

また、セマフォの資源使用可能数を1だとします。

処理Aの頭でセマフォロックをすると、セマフォの資源使用可能数は0個となり、処理Aが動いている間は処理Bは待機状態となります。

処理Aが処理完了すると、処理Bが動き出します。

セマフォの資源使用可能数を2とすれば、同時に動く処理は2つまで。

3つ目はイベントが発生してても、待機状態になります。

【Web開発初心者向け!】Web開発入門完全攻略 充実の18時間コース

どうやって使うの?

環境ごとに使い方は少し異なります。

Windows

Win32 APIでは、CreateSemaphore関数とReleaseSemaphore関数を使う。

.NET Framework

.NET Framework 2.0以降では、System.Threading.Semaphore クラスを使う。

バージョン1.1以前では自作するかWin32 APIを呼び出す必要がある。

.NET Framework 4.0以降では、軽量化されたSystem.Threading.SemaphoreSlim クラスを利用できる。

Java

Javaでは、java.util.concurrent.Semaphore クラスを使う。

Java 5以降で使用可能である。

Perl

Perlでは、Thread::Semaphore モジュールや、新しくCoro::Semaphore モジュールなどを使う。

Python

Pythonでは、threadingモジュール中にSemaphore クラスが用意されている。

以上Wikipediaより。

終わりに

本記事では、「処理Aが動いているときに、処理Bは動いて欲しくないんだけど、同期処理にはできないからなぁ…」とお悩みの方に向けた記事となりました。

そんなとき、「セマフォ」があるよというのを覚えておいていただけると幸いです。

フロントエンドエンジニアになりたい人の Webプログラミング入門

以上となります。

Java(Android)カテゴリの最新記事