Ниже мой вариант использования
У меня есть одна глобальная переменная и несколько потоков по всему процессору.
С атомным сравнением и обменом
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, который быстрее Atom_compare_and_swap или spin.trylock(), также если какой-либо другой метод?
Вам нужно использовать тест блокировки. неблокирующие тесты, такие как блокировка спина, которая в лучшем случае является тестированием и сном в цикле, требует много процессорных циклов в ущерб всем другим процессам. Попробуйте использовать семафор
new
которая является ключевым словом C ++