Multicore en synchronisatie

De bovenstaande twee threads worden tegelijk op verschillende cores uitgevoerd (er is geen herordening door de compiler). Welke uitkomst treedt niet op bij sequentiële consistentie, maar kan wel optreden bij echte CPU's zoals x86?

// 最初は x = 0, y = 0
// スレッド1      // スレッド2
x = 1;            y = 1;
r1 = y;           r2 = x;
  1. Ar1 = 1 en r2 = 1
  2. Br1 = 0 en r2 = 1
  3. Cr1 = 0 en r2 = 0
Antwoord en toelichting tonen

Antwoord: C. r1 = 0 en r2 = 0

Bij sequentiële consistentie gebeurt een van de schrijfacties als eerste, dus minstens één van de leesacties zou 1 moeten zien. Bij echte CPU's komt x = 1 echter eerst in de store buffer van de core, en de latere leesactie r1 = y kan eerder een waarde uit het hoofdgeheugen of de cache lezen voordat de schrijfactie voor andere cores zichtbaar wordt. Als dit bij beide cores gebeurt, lezen beide 0. Dit wordt voorkomen door tussen schrijven en lezen een geheugenbarrière te plaatsen.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Multicore en synchronisatie

  1. Welke eigenschap van het geheugenconsistentiemodel van x86 (TSO, Total Store Order) is juist?
  2. Wat is juist over zwakke geheugenconsistentiemodellen zoals die van ARM en RISC-V (RVWMO)?
  3. Wat is de juiste rol van een geheugenbarrière-instructie (fence)?
  4. In bovenstaande code bereidt thread 1 data voor en meldt dat met flag, en leest thread 2 data nadat hij flag heeft gezien. Wat is nodig om op een CPU met zwak geheugenconsistentiemodel zeker te zijn dat thread 2 de waarde 42 leest?
  5. Wat is juist over geheugenbewerkingen met acquire- en release-betekenis?

Vergelijkingen bij dit onderwerp