Sto cercando un equivalente di LWARX e STWCX (come trovato sui processori PowerPC) o un modo per implementare funzionalità simili sulla piattaforma x86. Inoltre, dove sarebbe il posto migliore per scoprire cose del genere (vale a dire buoni articoli/siti web/forum per la programmazione di lock/wait-free).equivalente x86 per LWARX e STWCX
Modifica
penso di aver bisogno di dare maggiori dettagli come viene ipotizzato che sto solo cercando un CAS (confrontare e swap) il funzionamento. Quello che sto cercando di fare è implementare un sistema di conteggio dei riferimenti senza vincoli con puntatori intelligenti a cui è possibile accedere e modificare da più thread. Fondamentalmente ho bisogno di un modo per implementare la seguente funzione su un processore x86.
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; }
ho davvero bisogno di qualcosa che imita LWARX e STWCX abbastanza accuratamente per tirare fuori questo (non riesco a trovare un modo per fare questo con l'CompareExchange, di scambio o di aggiungere funzioni che ho finora trovato per la x 86).
Grazie
DCAS sembra giusto, tranne io è necessario cambiare 1 parola solo se un puntatore a quella parola non cambia mentre si fa questo (è un po 'di confusione, si spera che l'aggiornamento alla domanda aiuti a chiarire questo). –
Sono riuscito a trovare una soluzione alternativa utilizzando DCAS, non è infallibile, poiché utilizza un ID univoco (4 byte di dimensioni) ma le probabilità che si interrompa sono ridotte perché sia l'UID a 4 byte sia il contatore a 4 byte ad esso adiacenti devono essere replicato esattamente. Questo è solo un problema se qualcosa cancella l'oggetto riassegna la memoria a qualcos'altro e poi riesce a duplicare quegli 8 byte mentre un altro thread sta provando a copiare un puntatore, che è un'operazione relativamente breve (operazione saggia cioè, la lunghezza è solo lunga abbastanza se il thread è interrotto) –
Non so in particolare il PPC, ma sulla maggior parte delle macchine, le istruzioni Load-Exclusive/Store-Conditional non aiutano molto con il problema ABA perché le operazioni di memoria eseguite tra un carico esclusivo e store-condizionale può far fallire spontaneamente l'operazione condizionale dello store. Se si rilegge il luogo sorvegliato e si vede che è cambiato, si può dire che qualcos'altro lo ha scritto con un nuovo valore, ma se ha lo stesso valore della lettura precedente, non ci sarà modo di distinguere un fallimento spontaneo da una scrittura ABA. – supercat