Je pensais que vous pourriez faire une file d'attente avec ces conditions sans utiliser Atomics ou tout fil des choses du tout en sécurité?
comme si c'est juste un tampon de cercle, un thread contrôle le pointeur de lecture, et l'autre contrôle le pointeur d'écriture. les deux ne se mettent pas à jour tant qu'ils n'ont pas fini de lire ou d'écrire. et ça marche?
le seul point de difficulté est de déterminer quand lire == écrire si la file d'attente est pleine ou vide, mais vous pouvez surmonter ce problème en avoir juste un élément factice toujours dans la file d'attente
class Queue
{
volatile Object* buffer;
int size;
volatile int readpoint;
volatile int writepoint;
void Init(int s)
{
size = s;
buffer = new Object[s];
readpoint = 0;
writepoint = 1;
}
//thread A will call this
bool Push(Object p)
{
if(writepoint == readpoint)
return false;
int wp = writepoint - 1;
if(wp<0)
wp+=size;
buffer[wp] = p;
int newWritepoint = writepoint + 1;
if(newWritepoint==size)
newWritePoint = 0;
writepoint = newWritepoint;
return true;
}
// thread B will call this
bool Pop(Object* p)
{
writepointTest = writepoint;
if(writepointTest<readpoint)
writepointTest+=size;
if(readpoint+1 == writepoint)
return false;
*p = buffer[readpoint];
int newReadpoint = readpoint + 1;
if(newReadpoint==size)
newReadPoint = 0;
readpoint = newReadPoint;
return true;
}
};
Une raison spécifique pour laquelle vous ne voulez pas crit section? C'est le plus rapide. – vpram86
Je veux verrouiller l'adresse afin qu'un autre thread puisse attendre avant de claquer. Un problème est survenu en utilisant la section critique, donc décidé de verrouiller la variable lui-même. :) – mahesh
Peut-être qu'il serait préférable de demander comment réparer votre file d'attente qui a utilisé une section critique.Les files d'attente sans verrouillage sont certainement possibles, mais un code sans verrouillage correct est * beaucoup * plus difficile à écrire que le code correct à l'aide de verrous. –