Wie bekannt ist, gibt es 6 std::memory_order's und 2 seine:Gibt es irgendwelche Auswirkungen auf die Operationen mit den Variablen unabhängig von Atomlast verbrauchen?
- acquire-semantische für Lasten - vermeidet Neuordnungs Last-Load und Lade-Speichere
- Release-semantische für den Speicher - vermeidet Neuordnungs Shop -Speichern und Lade-Speichere
Ie
static std::atomic<int> X;
static int L, S;
...
void thread_func()
{
int local1 = L; // load(L)-load(X) - !!! can be reordered with X !!!
S = local1; // store(S)-load(X) - !!! can be reordered with X !!!
int x_local = X.load(std::memory_order_acquire); // load(X)
int local2 = L; // load(X)-load(L) - can't be reordered with X
S = local2; // load(X)-store(S) - can't be reordered with X
}
Aber welche von Nachbestellungen über load(X)
kann konsumieren-semantische sein: für acquire-semantische, nur S = local1;
kann nach X.load(std::memory_order_acquire);
ausgeführt werden?
static std::atomic<int *> X;
static int L1, L2, S1, S2;
static int L, S;
...
void thread_func()
{
int *x_ptr_local = new int(1);
int local1 = L1; // load(L1)-load(X) - !!! can be reordered with X !!!
S1 = local1; // store(S1)-load(X) - !!! can be reordered with X !!!
int dependent_x1 = *x_ptr_local; // load(x_ptr)-load(X) - !!! can be reordered with X !!!
S = dependent_x1; // store(S)-load(X) - !!! can be reordered with X !!!
x_ptr_local = X.load(std::memory_order_consume); // load(X)
int dependent_x2 = *x_ptr_local; // load(X)-load(x_ptr) - can't be reordered with X
S = dependent_x2; // load(X)-store(S) - can't be reordered with X
int local2 = L2; // load(X)-load(L2) - !!! can be reordered with X !!!
S2 = local2; // load(X)-store(S2) - !!! can be reordered with X !!!
}
Ist es wahr, dass nur Operationen mit dependent_x2
nicht über X.load(std::memory_order_consume)
neu geordnet werden können?
Und alle Operationen mit Variablen L1
, L2
, S1
, S2
und dependent_x1
kann über X.load(std::memory_order_consume)
erst nachbestellt werden - das heißt kann entweder vor oder nach X.load(std::memory_order_consume)
durchgeführt werden, ist es nicht?
Warum konnte 'int local1 = L;' im ersten Beispiel nicht unter 'x_local' angeordnet werden? – 2501
@ 2501 ** (1) ** 'int local1 = L;' kann nicht neu geordnet werden ** (2) ** 'int x_local = X.load (std :: memory_order_acquire); ', weil beide - Loads, und' std :: memory_order_acquire' verhindern Load-Load-Neuordnung - wie auf dem Bild gezeigt, nicht wahr? – Alex
Ich sehe nur ** 2 ** Semantik zu erwerben, so wie 'S = local1;' kann unter ** 2 **, so kann ** 1 ** gehen. Was ist das Besondere an ** 1 **? – 2501