Поскольку 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
Как инициализируются функциональные статические переменные инициализированы потоки? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как инициализируются функциональные статические переменные инициализированы потоки?
Anonymous » » в форуме C++ - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему глобальные переменные не инициализированы в смешанном коде C ++/CLR?
Anonymous » » в форуме C++ - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-