k-相互制御 on C#

排他制御 - Wikipedia

k-相互制御とは同じプロセスがk個まで同時に稼動可能であること。.net frameworkに元からあるMutexクラスをつかうと普通の排他制御(多重起動禁止など)ができる。
id:kazuv3さんの「http://d.hatena.ne.jp/kazuv3/20080923/1222116824」のソースを使うと便利。
このソースをちょこっと拝借してk-相互制御をするプログラムを書いてみた。といってもほとんど同じw

クラスは

public class K_Mutex : IDisposable
{
    Mutex mutex;
    public K_Mutex(string name, int K)
    {
        for (int k = 0; k < K; k = (k + 1) % K)
        {
            mutex = new Mutex(false, string.Format("{0}-{1}", name, k));
            if (mutex.WaitOne(100))
                break;
            else
                mutex.Close();
        }
    }

    public void Dispose()
    {
        mutex.ReleaseMutex();
        mutex.Close();
        mutex = null;
    }

    ~K_Mutex()
    {
        if (mutex != null)
            Dispose();
    }
}

で、使用するときは

static void Main(string[] args)
{
    using (new K_Mutex("name", 3))
    {
        Console.WriteLine("start");
        Thread.Sleep(50000);
        Console.WriteLine("end");
    }
}

といった感じ。new K_Mutex("name", 3)の3が同時稼動可能数Kになっている。


適当に書いたので、これは頂けない…という部分があればご指摘ください。


id:kazuv3さんに感謝!