Multicore en synchronisatie

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?

// スレッド1         // スレッド2
data = 42;           while (flag == 0) { }
flag = 1;            print(data);
  1. AHet type van data wijzigen van int in long
  2. BDe schrijfactie naar flag als release en de leesactie van flag als acquire gebruiken om de volgorde te garanderen
  3. CNiets in de lus van thread 2 schrijven
Antwoord en toelichting tonen

Antwoord: B. De schrijfactie naar flag als release en de leesactie van flag als acquire gebruiken om de volgorde te garanderen

Bij een zwak model kunnen de twee schrijfacties van thread 1 verwisseld zichtbaar worden, of kan de leesactie van data in thread 2 vóór die van flag plaatsvinden, zodat flag 1 is terwijl data nog oud is. Als de schrijfactie naar flag een release is, is gegarandeerd dat eerdere schrijfacties eerst zichtbaar zijn, en als de leesactie van flag een acquire is, lopen latere leesacties niet vooruit.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Multicore en synchronisatie

  1. Wat is juist over geheugenbewerkingen met acquire- en release-betekenis?
  2. Waarom volstaat het in C niet om een flagvariabele die tussen threads wordt doorgegeven alleen volatile te maken als synchronisatie?
  3. Waarom kan bij _Atomic van C11 en std::atomic van C++11 de geheugenvolgorde (memory order) worden opgegeven?
  4. Welke vergelijking van 'grofkorrelige locks', waarbij een grote datastructuur als geheel door één lock wordt beschermd, en 'fijnkorrelige locks', waarbij delen elk door een eigen lock worden beschermd, is juist?
  5. Welke eigenschap van een lock-free algoritme is juist?

Vergelijkingen bij dit onderwerp