Потеря производительности в C ++ 0x и статических локальных переменных? - PullRequest
4 голосов
/ 15 мая 2011

Что такое реальная потеря производительности из-за того, что в C ++ 0x все другие потоки должны ожидать в таком случае:

string& program_name() {
  static string instance = "Parallel Pi";
  return instance;
}

Давайте предположим оптимальный сценарий: Программист был очень осторожен, что даже при 100 потоках только основной поток вызывает функцию program_name, все остальные 99 рабочие потоки заняты выполнением полезных вещей, которые не связаны свызывая эту «критическую» функцию.

Я цитирую новый C ++ 0x-Std § 6.7. (4) stmt.decl

...such объект инициализируется при первом прохождении управления через его объявление ... Если управление вводит объявление одновременно с инициализацией объекта, параллельное выполнение должно ожидать завершения инициализации ...

Что такое реалистичные накладные расходы, которые необходимы для использования реального компилятора, чтобы гарантировать, что статическая инициализация выполняется в соответствии с требованиями стандарта.

  • Требуется ли блокировка / мьютекс?Я предполагаю, что они дорогие, даже когда они на самом деле не нужны?
  • Если они дорогие, будет ли это сделано с помощью менее дорогих механизмов?

edit: добавлено string ...

Ответы [ 2 ]

2 голосов
/ 15 мая 2011

Если элемент управления вводит объявление одновременно во время инициализации объекта, параллельное выполнение должно ожидать завершения инициализации ...

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

Требуется ли блокировка / мьютекс?Я предполагаю, что они дорогие, даже когда не очень нужны?

Может быть.Мьютекс / блокировка на самом деле не , что дорого, они дорогие, только когда часто или ко всем потокам часто требуется доступ к заблокированному фрагменту кода.дорогой, это будет сделано менее дорогими механизмами?

Есть и другие решения AFAIK без блокировки.

1 голос
/ 15 мая 2011

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

...