Действительно ли функциональные статические переменные ориентированы на многопотоковое исполнение в GCC?

Без намного большей информации о проблеме (например, язык), одна вещь, которую можно сделать, состоит в том, чтобы избежать маслобойки выделения путем многократного использования выделений и не выделить, работать и свободный. Средство выделения такой как dlmalloc обрабатывает фрагментацию лучше, чем "куча" Win32.

58
задан Daniel Kamil Kozar 24 January 2014 в 02:55
поделиться

4 ответа

  1. Нет, это означает, что инициализация локальных статических является потокобезопасной.

  2. Вы определенно хотите оставить эту функцию включенной. Поточно-ориентированная инициализация локальных static s очень важна. Если вам нужен вообще потокобезопасный доступ к локальным static s, вам нужно будет добавить соответствующие средства защиты самостоятельно.

42
ответ дан 7 November 2019 в 05:35
поделиться

На самом деле это не ответ на ваши вопросы сразу ( Чарльз уже сделал это ), но я думаю, что пришло время разместить ссылку на эту статью еще раз. Он проливает свет на инициализацию глобальных переменных и должен быть прочитан и понят всеми, кто пытается использовать статические переменные в многопоточной среде.

6
ответ дан 7 November 2019 в 05:35
поделиться

Согласитесь с marc_s, это проблема двойного перехода.

Вам необходимо пройти аутентификацию Windows на всем пути, поэтому:

  • Запрос должен быть сделан в контексте пользователей Windows
  • IIS должен быть настроен на использование проверки подлинности Windows
  • Web.config должен быть настроен для проверки подлинности Windows с impersonate = true
  • . Пользователь, от имени которого работает пул приложений, должен иметь возможность выдавать себя за пользователя. Это обычное место, где возникает проблема двойного перехода.

Существует право, называемое «Олицетворять клиента после аутентификации»

http: //blogs.technet. локальная статика.

Я прочитал это как означающее, что это только инициализация статики, которая будет выполняться поточно-безопасным способом. Обычное использование статики небезопасно для потоков.

5
ответ дан 7 November 2019 в 05:35
поделиться

У нас были серьезные проблемы с кодом блокировки, сгенерированным 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 не может понять это правильно)

17
ответ дан 7 November 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: