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

0

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

У меня есть одна глобальная переменная и несколько потоков по всему процессору.

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

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

  • 3
    Примечание: не называйте вашу переменную new которая является ключевым словом C ++
  • 3
    Оба заняты петлей - нет никакой разницы (оба плохие)
Показать ещё 7 комментариев
Теги:
multithreading
locking
lockless

1 ответ

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню