簡體   English   中英

信號量:了解初始和最大請求​​數

[英]Semaphore: understanding initial and maximum number of requests

我正在學習 c# semaphore 並且不明白一點。 我可以像這樣初始化信號量:

var semaphore = new Semaphore(4, 6);

很多地方都有這樣的解釋:

如果要為調用線程保留一些插槽,可以通過使第一個參數小於第二個參數來實現。

這是否意味着只有主線程可以使用剩余的 2 個資源槽? 這是否意味着如果我這樣寫:

var semaphore = new Semaphore(0, 6);

只有主線程可以使用所有 6 個插槽?

我喜歡Albahari 的解釋

信號量就像夜總會:它有一定的容量,由保鏢強制執行。 一旦滿了,就沒有更多的人可以進入,外面就排起了長隊。 然后,對於每個離開的人,一個人從隊列的頭部進入。 構造函數至少需要兩個參數:夜總會當前可用的位置數量和俱樂部的總容量。

與鎖(監視器)和互斥鎖不同,信號量沒有“所有者” ——它與線程無關。 任何線程都可以在 Semaphore 上調用 Release,而對於 Mutex 和 lock,只有獲得鎖的線程才能釋放它。

初始值可用於發起可並發授予的信號量請求數。 它為相關信號量設置當前可用的並發級別。

而最大計數設置可以同時授予的信號量的最大請求數。 它為相關信號量設置了最大的潛在並發性。

您不能將計數器CurrentCount大於您在初始化中設置的最大計數。

以下示例顯示了信號量如何與線程無關:

    private static Semaphore semaphore = new Semaphore(3, 6);

    private static void Main(string[] args)
    {
        //semaphore.Release(); //openning another slot for concurreny

        semaphore.WaitOne();
        Console.WriteLine("main0");
        new Thread(() =>
        {
            semaphore.WaitOne();
            Console.WriteLine("thread0");
            semaphore.WaitOne();
            Console.WriteLine("thread1");
            Thread.Sleep(3000);
            Console.WriteLine("uncomment the release line to make main1 get in");

        }).Start();

        Thread.Sleep(1000);
        semaphore.WaitOne();
        Console.WriteLine("main1");
        Console.ReadKey();
    }

有關更多信息,查看http://www.albahari.com/threading/part2.aspx#_Semaphore

與互斥體不同,信號量可以在任何線程中使用 Release() 和 WaitOne()。 WaitOne() — 信號量遞減的計數器。 如果 counter == 0,則阻塞直到它增加。 Release() — 以信號量遞增的計數器。 第二個構造函數參數 == 計數器,阻塞直到它減少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM