4

追加: わかりました。ミューテックスとセマフォを分離できます。ただ知りたいのは、私のカウンターの考えは正しいですか? つまり、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);
        }
    }
}
4

2 に答える 2

5

ミューテックスは、基本的にセマフォの特殊なケースです。(実際には実装されていませんが) 1 から始まり、1 より大きくなることはできないセマフォと考えることができます。

Semaphoreaが整数mutexのラッパーであり、 a がブール値のラッパーであると想像してください。フリーまたはロックの 2 つの状態しかありません。

于 2013-01-07T19:22:08.713 に答える
1

Mutex は、許可されたスレッドが 1 つだけのセマフォを持つようなものです。

ミューテックスは一度に 1 つのリソースへのアクセスのみを許可しますが、セマフォは、リソースまたはコードの一部への同時アクセスを事前に設定した数だけ許可するように設定できます。

編集:

名前が付けられていれば、両方とも異なるプロセス間で使用できます。

于 2013-01-07T19:24:05.340 に答える