このページは役に立ちましたか。
このページのコンテンツについての ご意見をお待ちしております
その他にご意見はありますか。
残り 1500 文字
エクスポート (0) 印刷
すべて展開
この記事は翻訳者によって翻訳されたものです。 記事の文章にポインターを重ねると、原文のテキストが表示されます。
訳文
原文

Semaphore.Release メソッド (Int32)

指定した回数だけセマフォから出て、前のカウントを返します。

名前空間:  System.Threading
アセンブリ:  System (System.dll 内)

public int Release(
	int releaseCount
)

パラメーター

releaseCount
型: System.Int32
セマフォから出る回数。

戻り値

型: System.Int32
Release メソッドが呼び出される前のセマフォのカウント。

例外条件
ArgumentOutOfRangeException

releaseCount が 1 未満です。

SemaphoreFullException

セマフォのカウントは既に最大値です。

IOException

名前付きセマフォで Win32 エラーが発生しました。

UnauthorizedAccessException

現在のセマフォは名前付きシステム セマフォを表していますが、ユーザーに SemaphoreRights.Modify 権限がありません。

または

現在のセマフォは名前付きシステム セマフォを表していますが、SemaphoreRights.Modify 権限で開かれませんでした。

スレッドがセマフォに複数回入った場合、このメソッド オーバーロードにより、1 回の呼び出しでセマフォのカウント全体が復元されます。

Release メソッドから SemaphoreFullException がスローされても、呼び出し側のスレッドに問題があるとは限りません。 別のスレッドのプログラミング エラーが原因で、そのスレッドがセマフォに入った回数よりも多い回数だけセマフォから出たという可能性も考えられます。

現在の Semaphore オブジェクトが名前付きシステム セマフォを表している場合、ユーザーに SemaphoreRights.Modify 権限があり、セマフォが SemaphoreRights.Modify 権限で開かれている必要があります。

カウントの最大値が 3 で初期カウントが 0 のセマフォを作成するコード例を次に示します。 この例では 5 つのスレッドが開始され、ブロックされてセマフォを待機します。 メイン スレッドが Release(Int32) メソッド オーバーロードを使用してセマフォのカウントを最大値まで増加させ、3 つのスレッドがセマフォに入ることができるようにします。 各スレッドは、動作をシミュレートするために Thread.Sleep メソッドを使用して 1 秒間待機し、その後 Release() メソッド オーバーロードを呼び出してセマフォを解放します。

セマフォが解放されるたびに、前のセマフォのカウントが表示されます。 コンソール メッセージは、セマフォの使用状況を追跡します。 出力を読み取りやすくするために、シミュレートされた動作間隔がスレッドごとに若干増加します。


using System;
using System.Threading;

public class Example
{
    // A semaphore that simulates a limited resource pool.
    //
    private static Semaphore _pool;

    // A padding interval to make the output more orderly.
    private static int _padding;

    public static void Main()
    {
        // Create a semaphore that can satisfy up to three
        // concurrent requests. Use an initial count of zero,
        // so that the entire semaphore count is initially
        // owned by the main program thread.
        //
        _pool = new Semaphore(0, 3);

        // Create and start five numbered threads. 
        //
        for(int i = 1; i <= 5; i++)
        {
            Thread t = new Thread(new ParameterizedThreadStart(Worker));

            // Start the thread, passing the number.
            //
            t.Start(i);
        }

        // Wait for half a second, to allow all the
        // threads to start and to block on the semaphore.
        //
        Thread.Sleep(500);

        // The main thread starts out holding the entire
        // semaphore count. Calling Release(3) brings the 
        // semaphore count back to its maximum value, and
        // allows the waiting threads to enter the semaphore,
        // up to three at a time.
        //
        Console.WriteLine("Main thread calls Release(3).");
        _pool.Release(3);

        Console.WriteLine("Main thread exits.");
    }

    private static void Worker(object num)
    {
        // Each worker thread begins by requesting the
        // semaphore.
        Console.WriteLine("Thread {0} begins " +
            "and waits for the semaphore.", num);
        _pool.WaitOne();

        // A padding interval to make the output more orderly.
        int padding = Interlocked.Add(ref _padding, 100);

        Console.WriteLine("Thread {0} enters the semaphore.", num);

        // The thread's "work" consists of sleeping for 
        // about a second. Each thread "works" a little 
        // longer, just to make the output more orderly.
        //
        Thread.Sleep(1000 + padding);

        Console.WriteLine("Thread {0} releases the semaphore.", num);
        Console.WriteLine("Thread {0} previous semaphore count: {1}",
            num, _pool.Release());
    }
}


.NET Framework

サポート対象: 4、3.5、3.0、2.0

.NET Framework Client Profile

サポート対象: 4、3.5 SP1

Windows 7, Windows Vista SP1 以降, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core はサポート対象外), Windows Server 2008 R2 (SP1 以降で Server Core をサポート), Windows Server 2003 SP2

.NET Framework では、各プラットフォームのすべてのバージョンはサポートしていません。 サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。

コミュニティの追加

追加
表示:
© 2015 Microsoft