- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
private long m_IsExecuting;
// ...
public virtual void Execute(object parameter)
{
try
{
if (Interlocked.Read(ref m_IsExecuting) != 0)
return;
Interlocked.Increment(ref m_IsExecuting);
m_Execute(parameter);
}
finally
{
Interlocked.Decrement(ref m_IsExecuting);
}
}
Hubactep 18.05.2016 15:36 # +6
Класс Interlocked гарантирует атомарность операция только в своих методах, поэтому при переключении потоков между 9 и 11 строкой ваша блокировка идёт по пизде.
Но патч в виде
вместо строк 9 - 11 решил бы сразу две проблемы
yamamoto 18.05.2016 16:26 # 0
Но пропуск каждого второго выглядит забавнее :)
guesto 18.05.2016 17:47 # +2
bormand 18.05.2016 18:48 # +1
kerman 18.05.2016 23:46 # 0
Hubactep 19.05.2016 12:14 # +2
inkanus-gray 19.05.2016 12:56 # +3
Неприятность возникнет только в случае необработанного исключения, поскольку секции catch у нас нет. Тогда выполнение может быть заблокировано навсегда.
Hubactep 20.05.2016 17:22 # +3
inkanus-gray 20.05.2016 17:46 # 0
Я решил подстраховаться, потому что тут было предупреждение:
https://msdn.microsoft.com/ru-ru/library/zwc8s4fz.aspx
Но там уже про крайний случай, когда приложение должно аварийно завершиться.
bormand 20.05.2016 19:12 # +2
Какие-то взаимоисключающие параграфы...
inkanus-gray 20.05.2016 22:11 # +3
Windows производит настройку самонастраивающихся устройств.
bormand 20.05.2016 22:17 # 0