You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel/Services/AtomicBoolean.cs

74 lines
2.9 KiB

using System.Threading;
namespace ZeroLevel.Services
{
/// <summary>
/// Класс реализующий потокобезопасный флаг
/// </summary>
public sealed class AtomicBoolean
{
/// <summary>
/// Локер для переключения флага указывающего идет или нет процесс обработки
/// </summary>
private SpinLock _compareLocker = new SpinLock();
/// <summary>
/// Флаг, указывает идет ли в текущий момент процесс обработки очереди
/// </summary>
private bool _lock;
/// <summary>
/// Потокобезопасное переназначение булевой переменной
/// функция сранивает переменную со значением comparand
/// и при совпадении заменяет значение переменной на value
/// и возвращает true.
/// При несовпадении значения переменной и comparand
/// значение переменной останется прежним и функция
/// вернет false.
/// </summary>
/// <param name="target">Переменная</param>
/// <param name="value">Значение для проставления в случае совпадения</param>
/// <param name="comparand">Сравниваемое значение</param>
/// <returns>true - в случае совпадения значений target и comparand</returns>
private bool CompareExchange(ref bool target, bool value, bool comparand)
{
bool lockTaked = false;
try
{
_compareLocker.Enter(ref lockTaked);
if (target == comparand)
{
target = value;
return true;
}
return false;
}
finally
{
if (lockTaked) _compareLocker.Exit();
}
}
/// <summary>
/// Установка значения в true
/// </summary>
/// <returns>true - если значение изменилось, false - если значение занято другим потоком и не изменилось</returns>
public bool Set()
{
return CompareExchange(ref _lock, true, false);
}
/// <summary>
/// Сброс значения
/// </summary>
public void Reset()
{
CompareExchange(ref _lock, false, true);
}
public bool State
{
get
{
return _lock;
}
}
}
}

Powered by TurnKey Linux.