Semaphore Klas

Definitie

Hiermee beperkt u het aantal threads dat gelijktijdig toegang heeft tot een resource of pool met resources.

public ref class Semaphore sealed : System::Threading::WaitHandle
public sealed class Semaphore : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(false)]
public sealed class Semaphore : System.Threading.WaitHandle
type Semaphore = class
    inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(false)>]
type Semaphore = class
    inherit WaitHandle
Public NotInheritable Class Semaphore
Inherits WaitHandle
Overname
Semaphore
Overname
Kenmerken

Voorbeelden

In het volgende codevoorbeeld wordt een semaphore gemaakt met een maximumaantal van drie en een eerste telling van nul. In het voorbeeld worden vijf threads gestart, die blok wachten op de semaphore. De hoofdthread gebruikt de overbelasting van de Release(Int32) methode om het aantalemaforen tot het maximum te verhogen, zodat drie threads de semaphore kunnen invoeren. Elke thread gebruikt de Thread.Sleep methode om één seconde te wachten, om werk te simuleren en roept vervolgens de overbelasting van de methode aan om de Release() semafoor vrij te geven. Telkens wanneer deemafore wordt vrijgegeven, wordt het vorige aantal semaphore weergegeven. Consoleberichten houden het gebruik van de semafore bij. Het gesimuleerde werkinterval wordt enigszins verhoogd voor elke thread, zodat de uitvoer gemakkelijker te lezen is.

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(initialCount: 0, maximumCount: 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(releaseCount: 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());
    }
}
Imports System.Threading

Public Class Example

    ' A semaphore that simulates a limited resource pool.
    '
    Private Shared _pool As Semaphore

    ' A padding interval to make the output more orderly.
    Private Shared _padding As Integer

    <MTAThread> _
    Public Shared Sub 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 i As Integer = 1 To 5
            Dim t As New Thread(New ParameterizedThreadStart(AddressOf Worker))
            'Dim t As New Thread(AddressOf Worker)

            ' Start the thread, passing the number.
            '
            t.Start(i)
        Next 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.")
    End Sub

    Private Shared Sub Worker(ByVal num As Object)
        ' 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.
        Dim padding As Integer = Interlocked.Add(_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())
    End Sub
End Class

Opmerkingen

Gebruik de klasse om de Semaphore toegang tot een groep resources te beheren. Threads voeren deemafore in door de WaitOne methode aan te roepen, die wordt overgenomen van de WaitHandle klasse en de semafor vrij te geven door de methode aan te Release roepen.

Het aantal op een semaphore wordt steeds afgebroken wanneer een draad de semafor binnenkomt en verhoogd wanneer een thread de semaphore vrijgeeft. Wanneer het aantal nul is, worden volgende aanvragen geblokkeerd totdat andere threads de semaphore vrijgeven. Wanneer alle threads deemafore hebben vrijgegeven, is het aantal de maximumwaarde die is opgegeven toen de semaphore werd gemaakt.

Er is geen gegarandeerde volgorde, zoals FIFO of LIFO, waarin geblokkeerde threads de semaphore binnenkomen.

Een thread kan meerdere keren deemafore invoeren door de WaitOne methode herhaaldelijk aan te roepen. Als u sommige of al deze vermeldingen wilt vrijgeven, kan de thread de overbelasting van de parameterloze Release() methode meerdere keren aanroepen, of de methode-overbelasting aanroepen Release(Int32) waarmee het aantal vermeldingen wordt opgegeven dat moet worden vrijgegeven.

De Semaphore klasse dwingt geen thread-identiteit af voor aanroepen naar WaitOne of Release. Het is de verantwoordelijkheid van de programmeur om ervoor te zorgen dat threads niet te vaak de semafore vrijgeven. Stel dat een semaphore een maximumaantal van twee heeft en dat thread A en thread B beide de semaphore binnenkomen. Als een programmeerfout in thread B ervoor zorgt dat Release twee keer wordt aangeroepen, slagen beide aanroepen. Het aantal op de semaphore is vol, en wanneer thread A Release aanroept, uiteindelijk wordt er een SemaphoreFullException gegenereerd.

Semaphores zijn van twee typen: lokale semaphores en benoemde systeemsemaforen. Als u een Semaphore object maakt met behulp van een constructor die een naam accepteert, wordt het gekoppeld aan een besturingssysteemmafore van die naam. Benoemde systeemmaforen zijn zichtbaar in het hele besturingssysteem en kunnen worden gebruikt om de activiteiten van processen te synchroniseren. U kunt meerdere Semaphore objecten maken die dezelfde benoemde systeememafore vertegenwoordigen en u kunt de OpenExisting methode gebruiken om een bestaand benoemd systeememafore te openen.

Er bestaat alleen een lokale semaphore binnen uw proces. Het kan worden gebruikt door elke thread in uw proces die een verwijzing naar het lokale Semaphore object heeft. Elk Semaphore object is een afzonderlijke lokale semaphore.

Caution

Standaard is een benoemde semafore niet beperkt tot de gebruiker die deze heeft gemaakt. Andere gebruikers kunnen mogelijk deemafore openen en gebruiken, waaronder het verstoren van de semafore door de semafor meerdere keren te verkrijgen en niet vrij te geven. Als u de toegang tot specifieke gebruikers wilt beperken, kunt u een overbelasting van een constructor gebruiken of SemaphoreAcl een SemaphoreSecurity doorgeven bij het maken van de benoemde semafore. Vermijd het gebruik van benoemde semaforen zonder toegangsbeperkingen voor systemen die mogelijk niet-vertrouwde gebruikers code laten uitvoeren.

Constructors

Name Description
Semaphore(Int32, Int32, String, Boolean, SemaphoreSecurity)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, optioneel de naam van een systeemmaforeobject opgeeft, een variabele opgeeft die een waarde ontvangt die aangeeft of er een nieuwe systeemmafore is gemaakt en beveiligingstoegangsbeheer voor de systeemsemafore wordt opgegeven.

Semaphore(Int32, Int32, String, Boolean)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, eventueel de naam van een systeemsemaforeobject wordt opgegeven en een variabele wordt opgegeven die een waarde ontvangt die aangeeft of er een nieuwe systeememafore is gemaakt.

Semaphore(Int32, Int32, String, NamedWaitHandleOptions, Boolean)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, optioneel de naam van een systeemmaforeobject en opties opgeven om toegang tot gebruikersbereik en sessiebereik in te stellen en een variabele op te geven die een waarde ontvangt die aangeeft of er een nieuwe systeemsemafore is gemaakt.

Semaphore(Int32, Int32, String, NamedWaitHandleOptions)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven, en eventueel de naam van een systeemsemaphore-object en opties wordt opgegeven om toegang tot het gebruikersbereik en sessiebereik in te stellen.

Semaphore(Int32, Int32, String)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven en eventueel de naam van een systeemsemaforeobject wordt opgegeven.

Semaphore(Int32, Int32)

Initialiseert een nieuw exemplaar van de Semaphore klasse, waarbij het eerste aantal vermeldingen en het maximum aantal gelijktijdige vermeldingen wordt opgegeven.

Velden

Name Description
WaitTimeout

Geeft aan dat er een time-out optreedt voordat een WaitAny(WaitHandle[], Int32, Boolean) van de wachtgrepen is gesignaleerd. Dit veld is constant.

(Overgenomen van WaitHandle)

Eigenschappen

Name Description
Handle
Verouderd.
Verouderd.

Hiermee haalt u de systeemeigen ingang van het besturingssysteem op of stelt u deze in.

(Overgenomen van WaitHandle)
SafeWaitHandle

Hiermee haalt u de systeemeigen ingang van het besturingssysteem op of stelt u deze in.

(Overgenomen van WaitHandle)

Methoden

Name Description
Close()

Alle resources die door de huidige WaitHandleresources worden bewaard, worden vrijgegeven.

(Overgenomen van WaitHandle)
CreateObjRef(Type)

Hiermee maakt u een object dat alle relevante informatie bevat die nodig is om een proxy te genereren die wordt gebruikt om te communiceren met een extern object.

(Overgenomen van MarshalByRefObject)
Dispose()

Alle resources die door het huidige exemplaar van de WaitHandle klasse worden gebruikt, worden vrijgegeven.

(Overgenomen van WaitHandle)
Dispose(Boolean)

Wanneer deze worden overschreven in een afgeleide klasse, worden de onbeheerde resources die door de WaitHandleklasse worden gebruikt, uitgebracht en worden de beheerde resources optioneel vrijgegeven.

(Overgenomen van WaitHandle)
Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige object.

(Overgenomen van Object)
GetAccessControl()

Hiermee haalt u de beveiliging van toegangsbeheer voor een benoemd systeememafore op.

GetHashCode()

Fungeert als de standaardhashfunctie.

(Overgenomen van Object)
GetLifetimeService()
Verouderd.

Hiermee haalt u het huidige levensduurserviceobject op waarmee het levensduurbeleid voor dit exemplaar wordt beheerd.

(Overgenomen van MarshalByRefObject)
GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
InitializeLifetimeService()
Verouderd.

Hiermee haalt u een levensduurserviceobject op om het levensduurbeleid voor dit exemplaar te beheren.

(Overgenomen van MarshalByRefObject)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
MemberwiseClone(Boolean)

Hiermee maakt u een ondiepe kopie van het huidige MarshalByRefObject object.

(Overgenomen van MarshalByRefObject)
OpenExisting(String, NamedWaitHandleOptions)

Hiermee opent u de opgegeven benoemde semaphore, als deze al bestaat. Als de opties alleen zijn ingesteld op de huidige gebruiker, worden de toegangsbeheer van het object geverifieerd voor de aanroepende gebruiker.

OpenExisting(String, SemaphoreRights)

Hiermee opent u de opgegeven benoemde semaphore, als deze al bestaat, met de gewenste beveiligingstoegang.

OpenExisting(String)

Hiermee opent u de opgegeven benoemde semaphore, als deze al bestaat.

Release()

Hiermee wordt deemafore afgesloten en wordt het vorige aantal geretourneerd.

Release(Int32)

Hiermee wordt een opgegeven aantal keren deemafore afgesloten en wordt het vorige aantal geretourneerd.

SetAccessControl(SemaphoreSecurity)

Hiermee stelt u de beveiliging voor toegangsbeheer in voor een benoemd systeemmafore.

ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

(Overgenomen van Object)
TryOpenExisting(String, NamedWaitHandleOptions, Semaphore)

Hiermee opent u de opgegeven benoemde semafore, als deze al bestaat en retourneert u een waarde die aangeeft of de bewerking is geslaagd. Als de opties alleen zijn ingesteld op de huidige gebruiker, worden de toegangsbeheer van het object geverifieerd voor de aanroepende gebruiker.

TryOpenExisting(String, Semaphore)

Hiermee opent u de opgegeven benoemde semafore, als deze al bestaat en retourneert u een waarde die aangeeft of de bewerking is geslaagd.

TryOpenExisting(String, SemaphoreRights, Semaphore)

Hiermee opent u de opgegeven benoemde semaphore, als deze al bestaat, met de gewenste beveiligingstoegang en retourneert u een waarde die aangeeft of de bewerking is geslaagd.

WaitOne()

Hiermee blokkeert u de huidige thread totdat de stroom WaitHandle een signaal ontvangt.

(Overgenomen van WaitHandle)
WaitOne(Int32, Boolean)

Hiermee blokkeert u de huidige thread totdat de huidige WaitHandle een signaal ontvangt, met behulp van een 32-bits ondertekend geheel getal om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wacht wordt uitgevoerd.

(Overgenomen van WaitHandle)
WaitOne(Int32)

Hiermee blokkeert u de huidige thread totdat de huidige WaitHandle een signaal ontvangt, met behulp van een 32-bits ondertekend geheel getal om het tijdsinterval in milliseconden op te geven.

(Overgenomen van WaitHandle)
WaitOne(TimeSpan, Boolean)

Hiermee blokkeert u de huidige thread totdat het huidige exemplaar een signaal ontvangt, met behulp van een TimeSpan om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wacht wordt uitgevoerd.

(Overgenomen van WaitHandle)
WaitOne(TimeSpan)

Hiermee blokkeert u de huidige thread totdat het huidige exemplaar een signaal ontvangt met behulp van een TimeSpan signaal om het tijdsinterval op te geven.

(Overgenomen van WaitHandle)

Expliciete interface-implementaties

Name Description
IDisposable.Dispose()

Deze API ondersteunt de productinfrastructuur en is niet bedoeld om rechtstreeks vanuit de code te gebruiken.

Alle resources die worden gebruikt door de WaitHandle.

(Overgenomen van WaitHandle)

Extensiemethoden

Name Description
GetAccessControl(Semaphore)

Retourneert de beveiligingsdescriptors voor de opgegeven semaphore.

GetSafeWaitHandle(WaitHandle)

Hiermee haalt u de veilige ingang voor een systeemeigen wachtgreep van het besturingssysteem op.

SetAccessControl(Semaphore, SemaphoreSecurity)

Hiermee stelt u de beveiligingsdescriptors voor de opgegeven semaphore in.

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

Hiermee stelt u een veilige ingang in voor een systeemeigen wachtgreep voor het besturingssysteem.

Van toepassing op

Veiligheid thread

Dit type is thread veilig.

Zie ook