Я пытаюсь реализовать простой круговой буфер.
class MyCircularBuffer
{
byte[] Buffer = null;
private Object BufferLock = new object();
int readIndex = 0;
int writeIndex = 0;
int SpaceBetweenIndexes
{
get;
set;
}
int ReadIndex
{
get
{
return readIndex;
}
set
{
readIndex = value;
CalculateSpaceBetweenIndexes();
}
}
void CalculateSpaceBetweenIndexes()
{
if (readIndex <= writeIndex)
{
SpaceBetweenIndexes = writeIndex - readIndex;
}
else
{
SpaceBetweenIndexes = Length - (readIndex - writeIndex);
}
}
int WriteIndex
{
get
{
return writeIndex;
}
set
{
writeIndex = value;
CalculateSpaceBetweenIndexes();
}
}
int Length;
int Count
{
get
{
lock(BufferLock)
{
return Buffer.Count();
}
}
}
public MyCircularBuffer(int length)
{
Buffer = new byte[length];
this.Length = length;
ReadIndex = 0;
WriteIndex = 0;
}
public byte ReadByte()
{
while (SpaceBetweenIndexes <= 1)
{
CalculateSpaceBetweenIndexes();
}
ReadIndex++;
if (ReadIndex < Length)
{
Console.WriteLine("Read from index " + (ReadIndex-1) + " value " + this[ReadIndex - 1]);
return this[ReadIndex - 1];
}
else
{
ReadIndex = 0;
Console.WriteLine("Read from index " + (Length-1) + " value " + this[Length-1]);
return this[Length-1];
}
}
public void WriteByte(byte value)
{
WriteIndex++;
if (WriteIndex < Length)
{
Console.WriteLine("Wrote from index " + (WriteIndex-1) + " value " + value);
this[WriteIndex - 1] = value;
}
else if(writeIndex == Length)
{
Console.WriteLine("Wrote from index " + (WriteIndex-1) + " value " + value);
this[WriteIndex-1] = value;
WriteIndex = 0;
}
}
public byte this[int index]
{
get
{
lock(BufferLock)
{
return Buffer[index];
}
}
set
{
lock(BufferLock)
{
Buffer[index] = value;
}
}
}
}
Код для генерации теста:
class Program
{
public static MyCircularBuffer buff = new MyCircularBuffer(10);
static void Main(string[] args)
{
System.Threading.Thread t1 = new System.Threading.Thread(new System.Threading.ThreadStart(DrawByte));
System.Threading.Thread t2 = new System.Threading.Thread(new System.Threading.ThreadStart(WriteByte));
t2.Start();
t1.Start();
Console.ReadKey();
}
public static void DrawByte()
{
Random rand = new Random(50);
for (int i = 0; i < 20; i++)
{
buff.WriteByte((byte)(rand.Next()+1));
}
}
public static void WriteByte()
{
for (int i = 0; i < 20; i++)
{
buff.ReadByte(); //In this example my class is showing the results, so I didn't write here Console.Writeline...
}
}
}
Первый поток будет использовать метод ReadByte для получения байтов из этого буфера, а второй поток будет использовать метод WriteByte для записи байтов в буфер. У меня есть writeindex и readindex, которые перемещаются по буферу. Вроде бы все работает хорошо, но это:
Есть идеи/советы? Надеюсь, вы мне поможете, ребята!
readByte()
иwriteByte()
- person Domysee   schedule 08.10.2015WriteIndex++
, затем планировщик переходит к следующему потоку, который также выполняетWriteIndex++
. Потом оба потока пишут. Итак, теперь оба потока записывают в одну и ту же позицию, и у вас есть неверные данные. - person Domysee   schedule 08.10.2015System.Collections.Concurrent
и выберите то, что лучше всего соответствует вашим потребностям. - person Ivan Stoev   schedule 08.10.2015