LINUX.ORG.RU

boost не thread-safe?


0

0

На днях листал заголовочные файлы boost и наткнулся на следующие строки:

    template<class Path>
    class basic_filesystem_error : public filesystem_error
    {

      ...

      const path_type & path1() const
      {
        static const path_type empty_path;
        return m_imp_ptr.get() ? m_imp_ptr->m_path1 : empty_path ;
      }

      ...

    };
Получается, что работать с basic_filesystem_error можно только в одном потоке. Как это понимать?


Ответ на: комментарий от CL-USER

Извините, но не могли бы вы пояснить, что в данном случае гарантирует const? Насколько я знаю, статические переменные в функции инициализируются во время первого к ней обращения, которое может быть выполнено из нескольких потоков одновременно. Чем в данном случае может помочь const?

riYu
() автор топика

Копать в сторону макроса BOOST_HAS_THREADS и иже с ним.

MiracleMan ★★★★★
()
Ответ на: комментарий от riYu

> статические переменные в функции инициализируются во время первого к ней обращения

При запуске программы.

const86 ★★★★★
()
Ответ на: комментарий от const86

>> статические переменные в функции инициализируются во время первого к ней обращения

>При запуске программы.

2 my mind все же при первом обращении. И реализуется это через неявный if, примерно так:

static bool initialized = false;

if (!initialized) {...call constructor on static memory reserved for object and register its destructor via atexit()...; initialized = true}.

Что вероятно приводит к race condition в многотредовой среде.

Absurd ★★★
()
Ответ на: комментарий от vnovouhov

Хотя я вот сейчас глянул асмовый листинг, что gcc родил, инициализация статичного обьекта завернута в пару вызовов ___cxa_guard_acquire/___cxa_guard_release, так что не все так плохо как некоторые пацаки считают.

vnovouhov
()
Ответ на: комментарий от vnovouhov

То есть он синхронизируется при каждом обращении к локальной static переменной?

AFAIK Александреску в Loki::Singleton так и не смог придумать абсолютно кроссплатформенное и надежное решение без синхронизации при каждом обращении к синглтону, сказал только что на "хорошем" компиляторе способном генерировать код под многопроцессорные системы заклинание "volatile" должно помочь.

Absurd ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.