Предположим, что value
является вашей флаговой переменной. Должно быть объявлено volatile
.
long curvalue;
long newvalue;
do
{
curvalue = value;
newvalue = curvalue + 1;
}
while( _InterlockedCompareExchange( &value, newvalue, curvalue ) != curvalue );
Как видите, вы можете обобщить это на любой вид арифметики, который вам нужен, изменив операции, применяемые для вычисления newvalue
.
Если вы хотите сравнить два значения одновременно, лучше всего упаковать оба значения в одну переменную, а затем оперировать этой единственной переменной. Поскольку вы используете флаг в сочетании со счетчиком ссылок, я бы рекомендовал использовать младший бит value
в качестве флага «живого», а затем увеличивать / уменьшать на 2 за раз. Это позволяет вам кодировать как флаг, так и счетчик ссылок в одну 32-битную переменную.