Или любой другой способ реализации?
Давайте представим атом:
std::atomic<int> val;
val = 0;
Теперь я хочу обновить val, только если val не равен нулю.
if (val != 0) {
// <- Caveat if val becomes 0 here by another thread.
val.fetch_sub(1);
}
Так может быть:
int not_expected = 0;
val.hypothetical_not_compare_exchange_strong(not_expected, val - 1);
На самом деле вышеприведенное также не будет работать, потому что val может обновляться между val - 1
и гипотетической функцией.
Может быть это:
int old_val = val;
if (old_val == 0) {
// val is zero, don't update val. some other logic.
} else {
int new_val = old_val - 1;
bool could_update = val.compare_exchange_strong(old_val, new_val);
if (!could_update) {
// repeat the above steps again.
}
}
Редактировать:
val
- это переменная счетчика, не связанная с уничтожением объекта.Это должно быть без знака (так как число никогда не может быть отрицательным).
Из потока A: если тип 2 отправлен, тип 1 не может быть отправлен, если счетчик типа 2 не равен 0.
while(true) {
if counter_1 < max_type_1_limit && counter_2 == 0 && somelogic:
send_request_type1();
counter_1++;
if some logic && counter_2 == 0:
send_request_type2();
counter_2++;
}
поток B & C: ответ ручки:
if counter_1 > 0:
counter_1--
// (provided that after this counter_1 doesn't reduce to negative)
else
counter_2--