追加: わかりました。ミューテックスとセマフォを分離できます。ただ知りたいのは、私のカウンターの考えは正しいですか? つまり、Release から 1 を引いて、WaitOne で 1 を足します。カウンタがゼロより大きい場合にのみ、実行が許可されます。この発言は正しいですか?
うまく機能するコードがいくつかあります: first() second() third() を順番に実行します。
セマフォのカウンターがどのように機能するか知りたいだけですか? カウンターなのはわかっています。Release から 1 を引いて、WaitOne で 1 を足すと、カウンターが 0 より大きい場合にのみ、実行が許可されます。右?
しかし、私は別のこと、Mutex についての本を読みました。本には、Mutex Waitone から 1 を引いて、1 を解放すると書かれているので、mutex はセマフォの反対ですか? 右?
コード:
using System;
namespace Algorithm.MultiThread
{
class Semaphore
{
System.Threading.Semaphore s1, s2;
public Semaphore()
{
s1 = new System.Threading.Semaphore(1, 5);
s2 = new System.Threading.Semaphore(1, 5); //initialize as start counter 1
}
public void first()
{
Console.WriteLine("First");
s1.Release(); // minus one
}
public void second()
{
s1.WaitOne(); //add one two times
s1.WaitOne();
Console.WriteLine("Second");
s2.Release();
}
public void third()
{
s2.WaitOne(); // add one two times
s2.WaitOne();
Console.WriteLine("Third");
}
public void startnum(object obj)
{
int i = (int)obj;
switch (i)
{
case 1:
first();
break;
case 2:
second();
break;
case 3:
third();
break;
default:
break;
}
}
public static void test()
{
Semaphore s = new Semaphore();
System.Threading.Thread t1 = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(s.startnum));
System.Threading.Thread t2 = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(s.startnum));
System.Threading.Thread t3 = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(s.startnum));
t1.Start(3);
t2.Start(2);
t3.Start(1);
}
}
}