Это пара оптимизированных «рецептов», которые я придумал после прочтения других ответов.Не имеет прямого отношения к вопросу, но добавлю сюда, так как именно здесь попали похожие запросы.Пытался сохранить это значение до a > b
или a >= b
, чтобы соответствовать исходному вопросу.И чтобы они оставались общими, чтобы не отклонять описания от других связанных с этим проблем.Оба могут быть включены в методы.
Оптимизация - монотонный b
Если это операция only , которая выполняется для b
или b
в противном случае монотонно увеличивая , вы можете оптимизировать блокированное назначение и повторные попытки, где a > b == false
:
int initial;
do
{
initial = b;
}
while ((a > initial) && Interlocked.CompareExchange(ref b, a, initial) != initial);
Если a > b == false
, то после любой повторной попытки оно не будет true
b
только увеличивается) и обмен может быть пропущен, поскольку b
не будет затронут.
Оптимизация связанной с этим проблемы: Свободное регулирование
Действие signal()
должно называться только один раз каждый раз, когда локальная переменная a
(например, системная временная выборка) увеличивается на некоторую постоянную threshold >= 1
с момента последнего вызова signal()
.Здесь b
является пороговым заполнителем по сравнению с a
и установлен на a + threshold
, если a >= b
.Только «выигрышная» ветка должна вызывать signal()
.
var initial = b;
if ((a > initial) && Interlocked.CompareExchange(ref b, a + threshold, initial) == initial)
{
signal();
}
Здесь b
снова является монотонным, но теперь мы можем полностью оптимизировать цикл повторных попыток, поскольку нам нужно только знать, «победил ли локальный поток в гонке» с другими потоками, уважая threshold
.Этот метод будет эффективно «блокировать» любой другой поток от сигнализации в пределах определенного порога.
Предупреждения о регулировании
Этот способ не будет работать, если вам нужен «строгий» газ - то есть«самый маленький» a
, где a >= b
- таким образом, «свободный» в названии.Это также не сработает, если вам нужно сообщить только последнее из серии тесно сгруппированных a
s - что можно назвать "debouncing" , связанной, но отличной проблемой.