セマフォは、マルチスレッドの問題を解決するために頻繁に使用されるプログラミング概念です。コミュニティへの質問:
セマフォとは何ですか?また、どのように使用しますか?
ベストアンサー1
セマフォをナイトクラブの用心棒と考えてください。クラブには一度に入場できる人数が決まっています。クラブが満員の場合は誰も入場できませんが、1 人が退出するとすぐに別の人が入場できる可能性があります。
これは、特定のリソースのコンシューマーの数を制限するための単純な方法です。たとえば、アプリケーション内のデータベースへの同時呼び出しの数を制限します。
これは C# での非常に教育的な例です :-)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace TheNightclub
{
public class Program
{
public static Semaphore Bouncer { get; set; }
public static void Main(string[] args)
{
// Create the semaphore with 3 slots, where 3 are available.
Bouncer = new Semaphore(3, 3);
// Open the nightclub.
OpenNightclub();
}
public static void OpenNightclub()
{
for (int i = 1; i <= 50; i++)
{
// Let each guest enter on an own thread.
Thread thread = new Thread(new ParameterizedThreadStart(Guest));
thread.Start(i);
}
}
public static void Guest(object args)
{
// Wait to enter the nightclub (a semaphore to be released).
Console.WriteLine("Guest {0} is waiting to entering nightclub.", args);
Bouncer.WaitOne();
// Do some dancing.
Console.WriteLine("Guest {0} is doing some dancing.", args);
Thread.Sleep(500);
// Let one guest out (release one semaphore).
Console.WriteLine("Guest {0} is leaving the nightclub.", args);
Bouncer.Release(1);
}
}
}