Как инициализируются функциональные статические переменные инициализированы потоки?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как инициализируются функциональные статические переменные инициализированы потоки?

Сообщение Anonymous »

Поскольку C ++ 11, инициализация функциональных статических переменных является потоковой защитой. Переменная заблокирована (предположительно, мутекс) и инициализируется первым потоком, который входит в функцию. Были ли статические объекты в этой функции. По крайней мере, проверка каждый раз, когда называется функция.std::mutex mutex;

bool bHasBeenInitialisedOuter = false; // ANY NUMBER OF THREADS COULD BE CHECKING THIS
bool bHasBeenInitialisedInner = false; // THIS IS A SECOND FLAG IN CASE THE RACE CONDITION ON THE FIRST FLAG MADE THE THREAD ENTER WHEN IT SHOULDN'T HAVE

void func()
{
if (!bHasBeenInitialisedOuter)
{
mutex.lock(); // ANY OTHER THREADS WAIT HERE

if (!bHasBeenInitialisedInner)
{
bHasBeenInitialisedInner = true;

// INITIALISE OBJECT

bHasBeenInitialisedOuter = true; // ANY NUMBER OF OTHER THREADS COULD BE CHECKING THIS AT THE TIME THIS THREAD WRITES TO IT
// HOWEVER IT SHOULDN'T MATTER BECAUSE THE INNER FLAG MEMORY IS FLUSHED BEFORE (OR WHEN) UNLOCKING THE MUTEX
}

mutex.unlock();
}
}
< /code>
Я добавил два флага, потому что, скажем, первый поток заблокировал мутекс, и он записывается на флаг, который говорит, что он был инициализирован, в это время другие потоки могут читать эту переменную, И так это условие гонки, это правильно? > который только что был установлен на True, промывается для глобальной памяти или станет видимым для других потоков.
Я считаю, что внешний флаг не должен быть атомным. br /> Хотя, похоже, существует условие гонки на Bhasbeeninitialisedouter < /code>, это находится в реализации компилятора, поэтому я считаю, что это не UB, как это было бы в коде пользователя. < /p>
это то, как C ++ инициализирует статические переменные для AVID, используя атомные переменные?

Подробнее здесь: https://stackoverflow.com/questions/794 ... ead-safely
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»