Я думал, что вы могли бы создать очередь с этими условиями, не используя никакой атомарности или каких-либо потоковобезопасных вещей вообще?
, как если бы это был просто буфер круга, один поток контролировал указатель чтения, а другой контролировалуказатель записи.оба не обновляются, пока не закончат чтение или запись.и это просто работает?
единственная трудность заключается в определении при чтении == записи, заполнена ли очередь или пуста, но вы можете преодолеть это, просто поместив один фиктивный элемент в очередь
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;
}
};