Для потокобезопасной ленивой инициализации следует предпочесть статическую переменную внутри функции, std:: call_once или явную двойную проверку блокировки? Существуют ли какие-либо значимые различия?
В этом вопросе можно увидеть все три.
Double-Checked Lock Singleton в С++ 11
В Google появляются две версии двойной проверки блокировки в С++ 11.
Энтони Уильямс показывает и двойную блокировку с явным упорядочением памяти и std:: call_once. Он не упоминает статические, но эта статья могла быть написана до того, как были доступны компиляторы С++ 11.
Jeff Preshing, в обширной writeup, описывает несколько вариантов двойной блокировки. Он упоминает использование статической переменной в качестве опции, и он даже показывает, что компиляторы будут генерировать код для двойной проверки блокировки для инициализации статической переменной. Мне это не ясно, если он сделает вывод, что один путь лучше другого.
Мне кажется, что обе статьи должны быть педагогическими и что нет оснований для этого. Компилятор сделает это за вас, если вы используете статическую переменную или std:: call_once.