Мне интересно, как сделать внутри потока выполнения, чтобы быть потокобезопасным, позвольте мне объяснить это на примере:
позвольте мне сказать, что я хочу иметь конвейер команд, которые должны выполняться непрерывно одна за другой, но в моем потоке я не могу их ждать. Поток обычно спит, пробуждается, если какая-то команда ставится в очередь, затем он выполняет все команды в очереди и снова переходит в спящий режим, пока новая команда не будет поставлена в очередь. что-то вроде:
public void Enqueue(ICommand command)
{
this.queue.Enqueue(command);
this.synchroHandler.Set();
}
private void Pipeline()
{
while (true)
{
this.synchroHandler.WaitOne();
while (this.queue.Count > 0)
{
ICommand command = this.queue.Dequeue();
command.Execute();
}
// what if command will be enqueued between previous command - HERE
// ... and this command HERE
this.synchroHandler.Reset();
}
}
public void Main()
{
this.queue = new ThreadSafeQueue<ICommand>();
this.computionHandler = new ManualResetEvent(false);
Thread thread = new Thread(new ThreadStart(this.Pipeline));
thread.Start();
// start adding commands to pipeline
this.Enqueue(command1);
this.Enqueue(command2);
...
}
Допустим, моя реализация очереди является поточно-ориентированной, поэтому this.queue.Count, this.queue.Enqueue и this.queue.Dequeue используют одну и ту же блокировку. S показано в примере, если public Enqueue () будет вызван между "}" и this.synchroHandler.Reset (); поток будет в конечном итоге спящим, даже если у него есть один элемент в очереди (this.synchroHandler.Set () будет вызван непосредственно перед this.synchroHandler.Reset ()). Любая идея, как сделать эту схему потокобезопасной?