Sobes.tech
Назад к вопросам
Middle
3

Что нужно сделать для того, чтобы написать свой собственный Mutex? Что такое Compare-And-Swap?

Компании, где спрашивали
Graveling

Ответ от нейросети

sobes.tech AI

Чтобы написать собственный Mutex (взаимное исключение) в Go, нужно реализовать механизм, который гарантирует, что в один момент времени только одна горутина может получить доступ к критической секции.

Основные шаги:

  • Использовать атомарные операции для проверки и установки состояния блокировки.
  • Если блокировка занята, горутина должна ждать (например, через цикл с ожиданием или канал).

Compare-And-Swap (CAS) — это атомарная операция, которая сравнивает значение по адресу с ожидаемым и, если они совпадают, заменяет его на новое значение. Возвращает, была ли замена успешной.

CAS позволяет реализовать неблокирующие структуры данных и синхронизацию без использования тяжелых примитивов.

Пример упрощённого Mutex на основе CAS:

import (
    "sync/atomic"
    "runtime"
)

type Mutex struct {
    state int32
}

func (m *Mutex) Lock() {
    for !atomic.CompareAndSwapInt32(&m.state, 0, 1) {
        runtime.Gosched() // уступить планировщику
    }
}

func (m *Mutex) Unlock() {
    atomic.StoreInt32(&m.state, 0)
}

Здесь state равен 0, когда мьютекс свободен, и 1, когда заблокирован. Метод Lock пытается установить state в 1, если он был 0, используя CAS. Если не удалось, горутина уступает планировщику и повторяет попытку.