Ich renne in eine Situation, wo ich die atomare Summe von zwei Werten im Speicher brauche. Der Code, den ich geerbt geht so:Gibt es einen Weg, wie ich zwei atomare Lesevorgänge machen kann?
int a = *MemoryLocationOne;
memory_fence();
int b = *MemoryLocationTwo;
return (a + b) == 0;
Die einzelnen liest aus a und b sind atomar, und alle Schreibvorgänge an anderer Stelle im Code zu diesen beiden Speicherplätze sind auch Atom Lockless. Das Problem besteht jedoch darin, dass sich die Werte der beiden Standorte zwischen den beiden Lesevorgängen ändern können.
Also wie mache ich diese Operation atomar? Ich weiß alles über CAS, aber es neigt dazu, Lese-Modifizier-Schreib-Operationen nur atomar zu machen, und das ist nicht ganz das, was ich hier machen möchte.
Gibt es eine Möglichkeit, dies zu tun, oder ist es die beste Option, den Code zu refaktorieren, so dass ich nur einen Wert überprüfen muss?
Edit: Danke, ich habe nicht erwähnt, dass ich das in der ersten Revision sperrig machen wollte, aber einige Leute haben es nach meiner zweiten Revision aufgegriffen. Ich weiß, dass niemand Leuten glaubt, wenn sie solche Dinge sagen, aber ich kann Schlösser praktisch nicht benutzen. Ich müsste einen Mutex mit Atomics emulieren, und das wäre mehr Arbeit als das Refactoring des Codes, um einen Wert anstelle von zwei zu verfolgen.
Für jetzt meine Methode der Untersuchung nutzt Ausnutzen der Tatsache, dass die Werte konsekutiv sind und greifen sie atomar mit einem 64-Bit-Lesen, die ich bin atomare auf meinen Zielplattformen sicher. Wenn jemand neue Ideen hat, bitte trage dazu bei! Vielen Dank.
Sie passieren aufeinander folgenden 32-Bit-Adressen sein und die Prozessoren Ich muss arbeiten, um Code auf haben Atom-64-Bit, wenn sie richtig ausgerichtet liest so Das sieht nach dem Weg aus. –
Ah, in diesem Fall können Sie entweder eine Assembly schreiben oder einfach die Assembly-Ausgabe Ihres Compilers überprüfen, um zu überprüfen, ob ein 64-Bit-Typ das Richtige tut. In diesem Fall können Sie sperrenfrei gehen. – Eddie