난 당신이 어떤 아토 또는 전혀 스레드 안전한 재료를 사용하지 않고 그 조건 큐를 만들 수 있다고 생각
?
은 서클 버퍼가 단 하나이면 스레드가 읽기 포인터를 제어하고 다른 스레드는 쓰기 포인터를 제어하는 것과 같습니다. 모두 읽기 또는 쓰기가 끝날 때까지 업데이트되지 않습니다. 그리고 그냥 작동합니까? 어려움의
유일한 점은 큐가 꽉 찼거나 비어 있는지 쓰기 == 읽을 때 결정되어 있지만, 당신은 단지
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;
}
};
왜 crit 섹션을 원하지 않는 구체적인 이유가 있습니까? 그것의 가장 빠른 afaik. – vpram86
다른 스레드가 팝하기 전에 대기 할 수 있도록 주소를 잠그고 싶습니다. 임계 구역을 사용하여 어떤 문제가 발생 했으므로 변수 자체를 잠그기로 결정했습니다. :) – mahesh
아마도 중요한 섹션을 사용하여 큐를 수정하는 방법에 대해 물어 보는 것이 좋습니다.잠금없는 큐는 가능하지만 확실한 잠금없는 코드는 잠금을 사용하는 올바른 코드보다 쓰기가 훨씬 어렵습니다. –