Какой из них быстрее atomic_compare_and_swap или спин-трилок?

Ниже мой случай использования

У меня есть одна глобальная переменная и несколько потоков через все процессоры обращаются к этому.

С атомным сравнением и обменом

auto old = global_var;
auto new_var = old
for (;;) {
            new++;
            bool got_it = atomic_compare_and_swap(global_var,
                                  old,
                                  new_var);
            if (got_it) {
                return new_var;
            }
            old = global_var;
            new_var = old;
    }

Со спин-трилоком

for(;;)
    {
        auto temp = go_for_work();
        if (temp -> spin.trylock() == 0 )
        {
            continue;
        }

    }

... go_for_work
{
    auto old = global_var;
    auto new_var = old
    new_var++;
    global_var  =  new_var;
    return new_var
}

Это грубый код, надеюсь, это понятно. Дайте мне знать, если это не ясно.

global_var не является int, это структура.

Итак, моя главная цель - защитить global_var, который быстрее atomic_compare_and_swap или spin.trylock(), а также, если какой-то другой метод?

1 ответ

Вам нужно использовать блокирующий тест. Неблокирующие тесты, такие как спин-блокировка, которая в лучшем случае представляет собой тестирование и спящий цикл, занимают много процессорных циклов в ущерб всем другим процессам. Попробуйте использовать семафор

Другие вопросы по тегам