2017-01-25 2 views
0

Ниже поточно, так как каждый элемент массива доступен только один поток (в том числе в реальном мире часть здесь не показана):Нить локального статического массива в 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 
} 

Является ли эта функция поточно тоже (особенно с учетом инициализации массива, который имеет место при первом вызове функции, а не при запуске)?

+0

Глобальная переменная или локальная переменная 'static' в основном одинаковы. Все, что вы изменили, это просто масштаб (практически говоря). И инициализация локальных переменных 'static' является потокобезопасной. –

+0

Мы уверены, что инициализация ** статической ** локальной переменной производится при первом вызове подпрограммы? Я не могу - кто-нибудь может подтвердить это? – linuxfan

+0

@linuxfan Я не думаю, что в нем есть стандартное требование, так как оно не влияет на семантику. Но общая реализация заключается в том, чтобы поместить инициализированные переменные со статическим хранилищем в выделенный раздел '.data' в двоичном файле во время компиляции. На самом деле было бы нецелесообразно заставить компилятор включать * инициализационный код * один раз в функцию. Такой код потребует некоторого дополнительного отслеживания (некоторые другие статические переменные?). Обновление: Эй, смотрите, там ** есть стандартное требование ... –

ответ

3

Это безопасно. Все объекты со статическим временем хранения инициализируются до запуск программы. Это означает, что даже до того, как начнутся какие-либо потоки.

5.1.2 Execution environments: определены

Два среды выполнения: Свободностоящая и размещение. В оба случая, запуск программы происходит, когда назначенная функция C - это , вызываемая средой выполнения. Все объекты со статическим хранилищем длительность должна быть инициализирована (установлена ​​на их начальные значения) до запуска программы . Способ и время такой инициализации: в противном случае не указано. Окончание программы возвращает управление в среду выполнения .

(акцент мой).

C99 не имеет концепции потоков. Но именно так я интерпретирую приведенную выше цитату из стандарта.

+0

OT: Это мое впечатление, или люди по-прежнему предпочитают потоки POSIX над потоками C11? –

+0

Интересно. Подождите ... я понял, что локальная статика инициализируется при первом вызове функции? Так ли это на C++? – Silicomancer

+0

Вы должны обновить свои ссылки на текущий стандарт (окончательный вариант на самом деле): http://port70.net/~nsz/c/c11/n1570.html – Olaf

Смежные вопросы