Примитивы синхронизации могут быть реализованы с использованием std::atomic<T>
, по крайней мере, их пользовательской части. В C ++ 20 std::atomic<T>::wait
они могут быть основаны только на atomi c.
Вопрос в том, стоит ли использовать типы размером с указатель или типы меньшего размера.
C + +20 std::semaphore
- это пример, где максимальное значение передается как параметр шаблона, поэтому выбор может быть сделан во время компиляции, а не жестко запрограммирован.
Мои мысли на данный момент:
Я думаю, что на платформе, где futex
использует указанный c размер переменной, следует просто использовать этот размер. В Windows с гибким WaitOnAdress
есть место для выбора.
32-битные типы на x64 приводят к меньшему кодированию и той же эффективности, поэтому, вероятно, это путь к go. Дальнейшее сокращение до 16- и 8-битных типов, по-видимому, бесполезно (16-битные типы приводят к большей кодировке, чем 32-битные типы).
Также есть случай Windows на руке, для которого я не уверен.
Для std::semaphore
возможность выбора целочисленного типа на основе max является побочным эффектом специализации двоичного семафора, а не намерением.