Исключением является проблема безопасности потока.В частности, если у вас есть несколько потоков, выполняющих код, подобный этому, параллельно:
// s is a instance of Stack
if (s.Count > 0)
s.Pop()
, стек может быть освобожден другим потоком между вызовами s.Count
и s.Pop()
.Последующий вызов s.Pop()
завершается неудачно, поскольку стек пуст.
Одна (рекомендуемая) альтернатива в C # 4 - использовать System.Collections.Concurrent.ConcurrentStack
вместо Stack
.Этот класс включает метод TryPop
, который будет возвращать (как выходной параметр) верхний элемент в стеке, если стек не пуст, и false в противном случае.Поскольку процесс является атомарным, операция является поточно-ориентированной.
Второй вариант заключается в блокировке стека с использованием свойства SyncRoot
:
lock(s.SyncRoot)
{
if (s.Count > 0)
s.Pop();
}
Это предотвратит удаление нескольких потоковпредметы из стопки одновременно.