Без намного большей информации о проблеме (например, язык), одна вещь, которую можно сделать, состоит в том, чтобы избежать маслобойки выделения путем многократного использования выделений и не выделить, работать и свободный. Средство выделения такой как dlmalloc обрабатывает фрагментацию лучше, чем "куча" Win32.
Нет, это означает, что инициализация локальных статических
является потокобезопасной.
Вы определенно хотите оставить эту функцию включенной. Поточно-ориентированная инициализация локальных static
s очень важна. Если вам нужен вообще потокобезопасный доступ к локальным static
s, вам нужно будет добавить соответствующие средства защиты самостоятельно.
На самом деле это не ответ на ваши вопросы сразу ( Чарльз уже сделал это ), но я думаю, что пришло время разместить ссылку на эту статью еще раз. Он проливает свет на инициализацию глобальных переменных и должен быть прочитан и понят всеми, кто пытается использовать статические
переменные в многопоточной среде.
Согласитесь с marc_s, это проблема двойного перехода.
Вам необходимо пройти аутентификацию Windows на всем пути, поэтому:
Существует право, называемое «Олицетворять клиента после аутентификации»
http: //blogs.technet. локальная статика.
Я прочитал это как означающее, что это только инициализация статики, которая будет выполняться поточно-безопасным способом. Обычное использование статики небезопасно для потоков.
У нас были серьезные проблемы с кодом блокировки, сгенерированным GCC 3.4 для защиты локальной статической инициализации. Эта версия использовала глобальный общий мьютекс для защиты всех и любых статических инициализаций, которые приводят к тупиковой ситуации в нашем коде. У нас была локальная статическая переменная, инициализированная в результате функции, которая запустила другой поток, который создал локальную статическую переменную. Псевдокод:
voif f()
{
static int someValue = complexFunction();
...
}
int complexFunction()
{
start_thread( threadFunc() );
wait_for_some_input_from_new_thread();
return input_from_new_thread;
}
void threadFunc()
{
static SomeClass s();
...
}
Единственным решением было отключить эту функцию gcc. Если вам нужно, чтобы ваш код был переносимым, что мы и сделали, вы в любом случае не можете полагаться на функцию, добавленную в конкретной версии gcc для обеспечения безопасности потоков. Предположительно С ++ 0x добавляет потокобезопасную локальную статику, до тех пор это нестандартная магия, которая делает ваш код непереносимым, поэтому я не рекомендую этого делать. Если вы решите использовать его, я предлагаю вам проверить, что ваша версия gcc не использует для этой цели один глобальный мьютекс, написав образец приложения. (Сложность обеспечения безопасности потоков очевидна из того факта, что даже gcc не может понять это правильно)