Я занимаюсь разработкой асинхронного процессора задач. Мне нужен высокопроизводительный процессор, поэтому используемые примитивы синхронизации должны быть как можно более низкого уровня. Процессор должен содержать поток, который спит, когда нет задач, и просыпается, когда задачи появляются. Обработка задач и добавление задач должны выполняться в разных потоках.
Я попытался реализовать с AutoResetEvent
, но он имеет условие гонки:
public class Processor
{
ConcurrentQueue<Action> _workItemQueue = new ConcurrentQueue<Action>();
AutoResetEvent _newWorkItemAutoResetEvent = new AutoResetEvent(false);
private bool _disposed;
Thread _thread;
public void Do(Action action)
{
_workItemQueue.Enqueue(action);
_newWorkItemAutoResetEvent.Set();
}
public Processor()
{
_workerThread = new Thread(() =>
{
while (!_disposed)
{
_newWorkItemAutoResetEvent.WaitOne(); //
while (_workItemQueue.TryDequeue(out Action action))
{
action();
}
// at this "bad" moment another thread calls Do method.
// New action has been enqueued, but when we call
// _newWorkIteManualAutoEvent.WaitOne() we fall asleep.
}
});
_thread.Start();
}
}
Затем я попытался реализовать с ManualResetEvent
:
public class Processor
{
ConcurrentQueue<Action> _workItemQueue = new ConcurrentQueue<Action>();
ManualResetEventSlim _newWorkItemManualResetEvent = new ManualResetEventSlim(false);
private bool _disposed;
Thread _thread;
public void Do(Action action)
{
_workItemQueue.Enqueue(action);
_newWorkItemManualResetEvent.Set();
}
public Processor()
{
_workerThread = new Thread(() =>
{
while (!_disposed)
{
_newWorkItemManualResetEvent.WaitOne();
_newWorkItemManualResetEvent.Reset();
while (_workItemQueue.TryDequeue(out Action action))
{
action();
}
}
});
_thread.Start();
}
}
Я не Я не вижу никаких условий гонки в реализации с ManualResetEvent
.
ВОПРОС: Я прав? Или мне нужен другой примитив синхронизации? Я думаю о графе up Событие (реверс CountdownEvent
). Он сигнализируется, когда его счет больше нуля, и не сигнализируется, когда его счет равен нулю. Count up Счет событий соответствует количеству задач, которые должны быть выполнены.