У меня есть планировщик задач реализован так:замок Приобретать при выходе WaitOne
private readonly List<Task> mTasks = new List<Task>();
private readonly ManualResetEvent mNoTaskEvent = new ManualResetEvent(false);
public void AddTask(Task task)
{
lock (mTasks)
{
mTasks.Add(task);
mNoTaskEvent.Set();
}
}
public void RemoveTask(Task task)
{
lock (mTasks)
{
mTasks.Remove(task);
if (mTasks.Count == 0)
mNoTaskEvent.Reset();
}
}
void BackgroundThreadProc()
{
while (mRunning)
{
mNoTaskEvent.WaitOne();
if (!mRunning) break;
Task nextTask;
lock (mTasks)
{
mTasks.Sort(...);
nextTask = mTasks.First();
}
nextTask.Run();
}
}
mNoTaskEvent позволяет блокировать фоновый поток, когда нет задачи доступны. Состояние гонки, если другой поток удаляет все оставшиеся задания между «mNoTaskEvent.WaitOne()» и «lock (mTasks)».
Как я мог атомарно получить блокировку mTasks при выходе из mNoTaskEvent.WaitOne()?
Edit потоковой API имеет функцию, которая делает именно то, что мне нужно: pthread_cond_wait
Вы смотрели 'Monitor.Wait()' для этого? –
Да, но я не понимаю, как это может мне помочь, у вас есть идея? – Julien
Он заменит ResetEvent, а не увеличит его. –