public class RingQueue<T>
{
private int size;
private int read = 0;
private int write = 0;
private int count = 0;
private T[] objects;
public RingQueue (int size)
{
this.size = size;
objects = new T[size + 1];
}
public bool Empty {
get { return (read == write) && (count == 0); }
}
public bool Full {
get { return (read == write) && (count > 0); }
}
public void Write (T item)
{
if (Full)
throw new IndexOutOfRangeException ("Queue Full!");
objects[write] = item;
count++;
write = (write + 1) % size;
}
public T Read ()
{
if (Empty)
throw new IndexOutOfRangeException ("Queue Empty!");
T item = objects[read];
count--;
read = (read + 1) % size;
return item;
}
}
Monday, July 12, 2010
Generic Ring Buffer in C#
This data structure is helpful when creating lock-free algorithms. I'm not sure if the exceptions used are appropriate. Any suggestions?
Subscribe to:
Post Comments (Atom)
Popular Posts
-
I've just seen and used a brilliant ssh option. The command: sudo ssh -D localport user@externalhost will set up a local SOCKS proxy l...
-
Working with multiple threads is often a necessary evil. This is how I do it safely inside a Unity3D component. There are only certain time...
-
Update: This is another planet shader, with more physical fidelity. Shader "Planet" { Properties { _MainTex ("Di...
-
When you start working with threads in your Unity3D project, you will discover that many things need to be done in the main loop. For exampl...
-
Space is awesome. Especially when it is generated using Perlin noise, and some cool shaders. You can try it out over here.
-
Possibly slightly more correct lighting. The rim light is now only applied in the direction of the sun, rather than being purely based on v...
-
So, you've created a car prefab using WheelCollider components, and now you can apply a motorTorque to make the whole thing move along. ...
-
It is not an official port, but a very good replica. This is one of my favorite games, and I don't have many. It's deep, difficult, ...
-
Summary: NodeJS wins. Test Program ab -n 10000 -c 5 http://localhost/ Gevent Code from gevent import wsgi class WebServer(object): ...
-
Thank to Adrian Boeing I was inspired this morning to hack together a ripple shader for Unity3D. Thanks for the math Adrian. You can see t...
1 comment:
When writing, perhaps instead of an exception, you could grow the queue. Allocate a new array, copy the existing elements and then add the new item.
For reading, it seems appropriate to me, given the Empty property - there is a test to avoid the exception.
The other alternative is to return null, and let the application handle it. If not handled, a NullReferenceException would eventually result. Hmm.
Post a Comment