Thread Safe Queue
Поэтому набросал простую поточно безопасную очередь, конечно ей далеко до ConcurrentQueue, но с простыми задачами у меня в проекте она справляется. Может кому и здесь пригодится.
using System;
using System.Collections.Generic;
public class ConcurrentQueue<T>{
private readonly object syncLock = new object();
private Queue<T> queue;
public int Count
{
get
{
lock(syncLock)
{
return queue.Count;
}
}
}
public ConcurrentQueue()
{
this.queue = new Queue<T>();
}
public void Enqueue(T item)
{
lock(syncLock)
{
queue.Enqueue(item);
}
}
public T Dequeue()
{
lock(syncLock)
{
return queue.Dequeue();
}
}
public void Clear()
{
lock(syncLock)
{
queue.Clear();
}
}
}
Gits Link
9 комментариев
Вообще, как мне кажется, проще было бы унаследоваться от Queue или просто лочить его перед обращением, если таких мест не много. Я не фанат создания тонн классов.
Я не фанат повторяющегося кода, проще завести класс, чем копипастить, на то это и ООП.
Во-первых, необязательно в данном классе создавать объект для лока, если можно для этого использовать сам queue.
Во-вторых, поскольку текущий рендер (я про unity 4 говорю) работает в одном потоке, очередь без возврата в главный тред не особо применима в unity.
Ну и зачем огородить самописный огород, когда есть Loom и lock-free очереди?