Статический константный массив в многопоточном приложении
От: igna Россия  
Дата: 24.08.09 12:55
Оценка:
Является ли инициализация статического константного массива внутри функции thread-safe?

void f()
{
    static int const a[] = { 1, 2, 3, 4, 5 };
}
Re: Статический константный массив в многопоточном приложени
От: Vamp Россия  
Дата: 24.08.09 17:08
Оценка:
Здравствуйте, igna, Вы писали:

I>Является ли инициализация статического константного массива внутри функции thread-safe?


I>
I>void f()
I>{
I>    static int const a[] = { 1, 2, 3, 4, 5 };
I>}
I>

Вероятно, нет. Из общих соображений одновременная запись в одну и ту же область памяти не является безопасной.
Да здравствует мыло душистое и веревка пушистая.
Re: Статический константный массив в многопоточном приложени
От: Аноним  
Дата: 24.08.09 17:13
Оценка:
Здравствуйте, igna, Вы писали:

I>Является ли инициализация статического константного массива внутри функции thread-safe?


Нет.
Re: Статический константный массив в многопоточном приложени
От: vnp  
Дата: 24.08.09 19:36
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Является ли инициализация статического константного массива внутри функции thread-safe?


I>
I>void f()
I>{
I>    static int const a[] = { 1, 2, 3, 4, 5 };
I>}
I>


Я бы сказал, что да; во всяком случае, в чистом C. Статики инициализируются из сегмента данных один раз при загрузке образа, до начала исполнения программы. Никаких threads на этот момент не существует.
Насчет C++ подозреваю, что ответ тот же.
Re: Статический константный массив в многопоточном приложени
От: Sni4ok  
Дата: 24.08.09 19:43
Оценка: -1
Здравствуйте, igna, Вы писали:

I>Является ли инициализация статического константного массива внутри функции thread-safe?


I>
I>void f()
I>{
I>    static int const a[] = { 1, 2, 3, 4, 5 };
I>}
I>


платформозависимо, под студией — небезопасно, а вот в gcc к примеру — безопасно.
Re[2]: Статический константный массив в многопоточном прилож
От: Vamp Россия  
Дата: 24.08.09 20:02
Оценка: -1
vnp>Насчет C++ подозреваю, что ответ тот же.
Нет. В С++ объект будет инициализирован при первом вхождении в функцию. В многопоточном приложении это первое вхождение может происходить одновременно.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Статический константный массив в многопоточном прилож
От: Николай Ивченков  
Дата: 24.08.09 21:16
Оценка: 29 (3) +1
Vamp:

vnp>>Насчет C++ подозреваю, что ответ тот же.

V>Нет. В С++ объект будет инициализирован при первом вхождении в функцию. В многопоточном приложении это первое вхождение может происходить одновременно.

Откуда такие сведения?

8.5.1/14:

When an aggregate with static storage duration is initialized with a brace-enclosed initializer-list, if all the member initializer expressions are constant expressions, and the aggregate is a POD type, the initialization shall be done during the static phase of initialization (3.6.2)

Re: Статический константный массив в многопоточном приложени
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.08.09 21:19
Оценка:
Здравствуйте, igna, Вы писали:

I>Является ли инициализация статического константного массива внутри функции thread-safe?


I>
I>void f()
I>{
I>    static int const a[] = { 1, 2, 3, 4, 5 };
I>}
I>


В Си — да, поскольку такая инициализация происходит до старта программы (реально, массив располагается в области памяти, проинициализированной линкером, а не в runtime).
Re[2]: Статический константный массив в многопоточном прилож
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.08.09 21:21
Оценка: +1
Здравствуйте, Sni4ok, Вы писали:

I>>
I>>void f()
I>>{
I>>    static int const a[] = { 1, 2, 3, 4, 5 };
I>>}
I>>


S>платформозависимо, под студией — небезопасно, а вот в gcc к примеру — безопасно.


А что такого небезопасного делает студия в этом месте? Неужели заводит флаг, проинициализирован ли массив, и инициализирует его во время исполнения? Зачем ей это делать так сложно?
Re[4]: Статический константный массив в многопоточном прилож
От: Vamp Россия  
Дата: 24.08.09 21:22
Оценка:
НИ>8.5.1/14:
Пробел в моих знаниях. Спасибо.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Статический константный массив в многопоточном прилож
От: CoolCmd Россия  
Дата: 25.08.09 08:39
Оценка:
Здравствуйте, vnp, Вы писали:

I>>void f()
I>>{
I>>    static int const a[] = { 1, 2, 3, 4, 5 };
I>>}
I>>


vnp>Я бы сказал, что да; во всяком случае, в чистом C. Статики инициализируются из сегмента данных один раз при загрузке образа, до начала исполнения программы. Никаких threads на этот момент не существует.

vnp>Насчет C++ подозреваю, что ответ тот же.
В приведенным выше примере safe. А если
void f(int vvv)
{
  static int const a[] = { vvv, 2, 3, 4, 5 };
}
то вроде как уже не safe.
простите, я убил небо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.