Ниже поточно, так как каждый элемент массива доступен только один поток (в том числе в реальном мире часть здесь не показана):Нить локального статического массива в C99
static bool myArray[THREAD_COUNT] = {false}; // Only used in DoSomething()
void DoSomething(uint8_t threadIndex)
{
myArray[threadIndex] = true;
// Real world function is more complex
}
Теперь рассмотрим следующий код:
void DoSomething(uint8_t threadIndex)
{
static bool myArray[THREAD_COUNT] = {false};
myArray[threadIndex] = true;
// Real world function is more complex
}
Является ли эта функция поточно тоже (особенно с учетом инициализации массива, который имеет место при первом вызове функции, а не при запуске)?
Глобальная переменная или локальная переменная 'static' в основном одинаковы. Все, что вы изменили, это просто масштаб (практически говоря). И инициализация локальных переменных 'static' является потокобезопасной. –
Мы уверены, что инициализация ** статической ** локальной переменной производится при первом вызове подпрограммы? Я не могу - кто-нибудь может подтвердить это? – linuxfan
@linuxfan Я не думаю, что в нем есть стандартное требование, так как оно не влияет на семантику. Но общая реализация заключается в том, чтобы поместить инициализированные переменные со статическим хранилищем в выделенный раздел '.data' в двоичном файле во время компиляции. На самом деле было бы нецелесообразно заставить компилятор включать * инициализационный код * один раз в функцию. Такой код потребует некоторого дополнительного отслеживания (некоторые другие статические переменные?). Обновление: Эй, смотрите, там ** есть стандартное требование ... –