Требуется ли для получения спин-блокировки сравнение-своп или достаточно свопа? - PullRequest
0 голосов
/ 13 ноября 2018

Предположим, у нас есть реализация spinlock:

struct Lock {
    locked : Atomic(bool),
}

Тогда функция разблокировки может быть:

fun unlock(lock : &Lock) {
    atomic_store(&lock.locked, false, release);
}

Но как насчет lock?Обычно он использует сравнение и своп, как это:

fun lock(lock : &Lock) {
    while atomic_compare_and_swap(&lock.locked, false, true, acquire) {}
}

Но разве для этого не хватит свопа?Примерно так:

fun lock(lock : &Lock) {
    while atomic_swap(&lock.locked, true, acquire) {}
}

Есть ли с этим проблемы?

1 Ответ

0 голосов
/ 14 ноября 2018

Сравнение и замена не являются действительно необходимыми.Атомная установка флага true, если он равен false, логически эквивалентна безусловной установке его true.

Безусловный своп может быть немного быстрее, поскольку не нужно ничего сравнивать, хотя реальная стоимостьатомарной операции чтения-изменения-записи в получении и блокировке строки кэша.

Вот пример спин-блокировки C ++, которая использует exchange()

#include <atomic>

class mutex {
    std::atomic<bool> flag{false};

public:
    void lock()
    {
        while (flag.exchange(true, std::memory_order_acquire));
    }

    void unlock()
    {
        flag.store(false, std::memory_order_release);
    }
};
...