Sök…


Syntax

  • #ifdef __STDC_NO_ATOMICS__
  • # error this implementation needs atomics
  • #endif
  • #include <stdatomic.h>
  • osignerad _Atomisk räknare = ATOMIC_VAR_INIT (0);

Anmärkningar

Atomik som en del av C-språket är en valfri funktion som finns tillgänglig sedan C11.

Deras syfte är att säkerställa rasfri tillgång till variabler som delas mellan olika trådar. Utan atomkvalificering skulle tillståndet för en delad variabel vara odefinierat om två trådar får åtkomst till den samtidigt. Exempelvis kan en inkrementoperation ( ++ ) delas upp i flera monteringsinstruktioner, en läsning, själva tillägget och en butiksinstruktion. Om en annan tråd skulle göra samma operation kan deras två instruktionssekvenser sammanflätas och leda till ett inkonsekvent resultat.

  • Typer: Alla objekttyper med undantag av arraytyper kan kvalificeras med _Atomic .

  • Operatörer: Alla läs-modifiera-skrivoperatörer (t.ex. ++ eller *= ) på dessa är garanterade atomiska.

  • Operationer: Det finns några andra operationer som anges som typgeneriska funktioner, t.ex. atomic_compare_exchange .

  • Trådar: Tillgång till dem garanteras inte att det kommer att producera datarace när de nås av olika trådar.

  • Signalhanterare: Atomtyper kallas låsfria om alla operationer på dem är statslösa. I så fall kan de också användas för att hantera tillståndsändringar mellan normalt styrflöde och en signalhanterare.

  • Det finns bara en datatyp som garanteras vara atomic_flag : atomic_flag . Detta är en minimal typ vem som är verksamt är avsedd att kartlägga till effektiva test-och-inställning av maskinvaruinstruktioner.

Andra metoder för att undvika rasförhållanden finns tillgängliga i C11: s trådgränssnitt, i synnerhet en mutex-typ mtx_t att ömsesidigt utesluta trådar från åtkomst till kritisk data eller kritiska kodavsnitt. Om atom inte finns, måste dessa användas för att förhindra raser.

atom och operatörer

Atomvariabler kan nås samtidigt mellan olika trådar utan att skapa rasförhållanden.

/* a global static variable that is visible by all threads */
static unsigned _Atomic active = ATOMIC_VAR_INIT(0);


int myThread(void* a) {
  ++active;         // increment active race free
  // do something
  --active;         // decrement active race free
  return 0;
}

Alla valvoperationer (operationer som modifierar objektet) som är tillåtna för bastypen är tillåtna och kommer inte att leda till rasförhållanden mellan olika trådar som kommer åt dem.

  • Operationer på atomföremål är vanligtvis ordningsföljder som är långsammare än normala aritmetiska operationer. Detta inkluderar också enkel last eller butik. Så du bör bara använda dem för kritiska uppgifter.
  • Vanliga aritmetiska operationer och tilldelning såsom a = a+1; är faktiskt tre operationer på a : först en last, sedan tillägg och slutligen en butik. Detta är inte rasfritt. Endast operationen a += 1; och a++; är.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow