Kommentar
Å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.
Om du vill synkronisera åtkomst till en resurs använder du något av synkroniseringsobjekten i någon av väntefunktionerna. Tillståndet för ett synkroniseringsobjekt signaleras antingen eller icke-signalerad. Väntefunktionerna tillåter att en tråd blockerar sin egen körning tills ett angivet icke-signalerat objekt har angetts till det signalerade tillståndet. Mer information finns i Synkronisering mellan processer.
Att välja rätt synkroniseringsprimitiv
| Primitiv | Scope | Performance | Reentrant | När det bör användas |
|---|---|---|---|---|
| SRW-lås (Slim Reader/Writer) | Enskild process | Snabb (vanligtvis i användarläge; kan gå in i kärnan vid konkurrens) | No | Standardval för läsintensiva arbetsbelastningar i modern kod. Minsta minnesfotavtryck (pekarstorlek). |
| Kritiskt avsnitt | Enskild process | Snabb (snurrar sedan kernelvänte) | Ja | Använd när du behöver återinträdes-/rekursiv låsning i en och samma process. Något större än SRW. |
| Mutex | Processövergripande (namngiven) | Långsammare (alltid kernelobjekt) | Ja | Krävs för synkronisering mellan processer via en namngiven mutex. Också användbart med WaitForMultipleObjects. |
| Semafor | Mellan processer (namngiven) | Kernel-objekt | N/A | Begränsar samtidig åtkomst till en resurspool (t.ex. anslutningspool för N-objekt). |
| Händelse | Mellan processer (namngiven) | Kernel-objekt | N/A | Signalering mellan trådar/processer. Använd för "något hände"-meddelanden, inte för att skydda data. |
C++ std::mutex / std::shared_mutex |
Enskild process | Implementeringsdefinierad | No | Rekommenderas för portabel C++-kod och RAII. Använd när du inte behöver Win32-väntande API:er eller synkronisering mellan processer. |
Note
SRW-lås jämfört med kritiska avsnitt: För ny kod som inte kräver rekursiv låsning föredrar du SRW-lås (AcquireSRWLockExclusive/AcquireSRWLockShared). De är mindre, snabbare och stöder läsar-/skrivarsemantik. Kritiska avsnitt är fortfarande lämpliga när du behöver återinträdesbar (rekursiv) låsning av en och samma tråd.
Important
Vanligt misstag: Att använda en Mutex för synkronisering inom processen när ett kritiskt avsnitt eller SRW-lås räcker. Mutexes omfattar alltid en övergång till kernelläge, vilket gör dem betydligt långsammare för högfrekventa åtgärder i en enda process.
Följande är andra synkroniseringsmekanismer:
- överlappade in- och utdata
- asynkront proceduranrop
- kritiska avsnittsobjekt
- villkorsvariabler
- slimmade läsare/skrivarlås
- engångsinitiering
- sammanflätad variabelåtkomst
- sammanflätade enkelt länkade listor
- tidsinställda köer
- makrot MemoryBarrier
Mer information om synkronisering finns i Synkronisering och Problem med flera processorer.