10 Stimmen

x86-Entsprechung für LWARX und STWCX

Ich bin auf der Suche nach einem Äquivalent von LWARX und STWCX (wie auf den PowerPC-Prozessoren gefunden) oder eine Möglichkeit, ähnliche Funktionalität auf der x86-Plattform zu implementieren. Wo kann man sich am besten über solche Dinge informieren (d.h. gute Artikel/Webseiten/Foren für sperr- und wartungsfreie Programmierung)?


Editer
Ich glaube, ich muss mehr Details angeben, da angenommen wird, dass ich nur nach einer CAS-Operation (Compare and Swap) suche. Ich versuche, ein sperrfreies Referenzzählsystem mit intelligenten Zeigern zu implementieren, auf die mehrere Threads zugreifen und sie ändern können. Ich brauche im Grunde eine Möglichkeit, die folgende Funktion auf einem x86-Prozessor zu implementieren.

int\* IncrementAndRetrieve(int \*\*ptr)
{
  int val;
  int \*pval;
  do
  {
    // fetch the pointer to the value
    pval = \*ptr;

    // if its NULL, then just return NULL, the smart pointer
    // will then become NULL as well
    if(pval == NULL)
      return NULL;

    // Grab the reference count
    val = lwarx(pval);

    // make sure the pointer we grabbed the value from
    // is still the same one referred to by  'ptr'
    if(pval != \*ptr)
      continue;

    // Increment the reference count via 'stwcx' if any other threads
    // have done anything that could potentially break then it should
    // fail and try again
  } while(!stwcx(pval, val + 1));
  return pval;
}

Ich brauche wirklich etwas, das LWARX und STWCX ziemlich genau nachahmt, um dies zu erreichen (ich kann keinen Weg finden, dies mit den Funktionen CompareExchange, swap oder add zu tun, die ich bisher für x86 gefunden habe).

Danke

0voto

Ringding Punkte 2846

Was Sie versuchen, wird nicht so funktionieren, wie Sie es erwarten. Was Sie oben implementiert haben, kann mit der InterlockedIncrement-Funktion (Win32-Funktion; Assembly: XADD) durchgeführt werden.

Der Grund dafür, dass Ihr Code nicht das tut, was Sie denken, ist, dass ein anderer Thread den Wert zwischen dem zweiten Lesen von *ptr und stwcx noch ändern kann, ohne stwcx ungültig zu machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X