Какой из них быстрее 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 (), а также, если какой-то другой метод?

0

Решение

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

0

Другие решения


По вопросам рекламы [email protected]