Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
För att undvika konkurrensförhållanden och dödlägen är det nödvändigt att synkronisera åtkomsten med flera trådar till delade resurser. Synkronisering är också nödvändigt för att säkerställa att kod som är beroende av varandra körs i rätt ordning.
Det finns ett antal objekt vars handtag kan användas för att synkronisera flera trådar. Dessa objekt omfattar:
- Konsolens inmatningsbuffertar
- Evenemang
- Mutexes
- Processer
- Semaforer
- Trådar
- Tidtagare
Tillståndet för vart och ett av dessa objekt signaleras eller signaleras inte. När du anger ett handtag för något av dessa objekt i ett anrop till någon av väntefunktionerblockeras körningen av den anropande tråden tills tillståndet för det angivna objektet signaleras.
Vissa av dessa objekt är användbara för att blockera en tråd tills någon händelse inträffar. Till exempel signaleras ett bufferthandtag för konsolindata när det finns olästa indata, till exempel ett tangenttryckning eller musklick. Process- och trådhandtag signaleras när processen eller tråden avslutas. Detta gör att en process till exempel kan skapa en underordnad process och sedan blockera sin egen körning tills den nya processen har avslutats.
Andra objekt är användbara för att skydda delade resurser från samtidig åtkomst. Flera trådar kan till exempel ha ett handtag till ett mutex-objekt. Innan du kommer åt en delad resurs måste trådarna anropa någon av de väntefunktionerna för att vänta på att tillståndet för mutexen ska signaleras. När mutexen signaleras släpps endast en väntande tråd för att komma åt resursen. Mutex-tillståndet återställs omedelbart till att inte signaleras så att andra väntande trådar förblir blockerade. När tråden är klar med resursen måste den ange mutex-tillståndet till signalerat så att andra trådar kan komma åt resursen.
För trådarna i en enda process ger kritiska avsnittsobjekt ett effektivare sätt att synkronisera än mutexes. Ett kritiskt avsnitt används som en mutex för att tillåta en tråd i taget att använda den skyddade resursen. En tråd kan använda funktionen EnterCriticalSection för att begära ägarskap för ett kritiskt avsnitt. Om den redan ägs av en annan tråd blockeras den begärande tråden. En tråd kan använda funktionen TryEnterCriticalSection för att begära ägarskap för ett kritiskt avsnitt, utan att blockera om det inte går att hämta det kritiska avsnittet. När den har fått ägarskap är tråden fri att använda den skyddade resursen. Körningen av de andra trådarna i processen påverkas inte om de inte försöker komma in i samma kritiska avsnitt.
Funktionen WaitForInputIdle gör att en tråd väntar tills en angiven process initieras och väntar på användarindata utan väntande indata. Att anropa WaitForInputIdle kan vara användbart för synkronisering av huvud- och underprocesser, eftersom CreateProcess- returnerar utan att vänta på att underprocessen ska initiera sig.
Mer information finns i Synkronisering.