Я читал это: http://en.wikipedia.org/wiki/Thread_safety
Действительно ли следующая функция ориентирована на многопотоковое исполнение?
void foo(int y){
int * x = new int[50];
/*...do some stuff with the allocated memory...*/
delete [] x;
}
В статье это говорит, что, чтобы быть ориентированными на многопотоковое исполнение можно только использовать переменные от стека.В самом деле? Почему? Не был бы последующие вызовы вышеупомянутой функции выделять память в другом месте?
Править: А-ч. Похож я неправильно читал эту часть статьи:
Подпрограмма повторно используема, и таким образом ориентирована на многопотоковое исполнение, если
- единственные переменные, которые это использует, от стека
(Я взял его для значения
Подпрограмма повторно используема, и таким образом ориентирована на многопотоковое исполнение, если и только если
- единственные переменные, которые это использует, от стека
, который согласно ответам ниже, не имеет место),
Если вы пишете в среде, поддерживающей многопоточность, то можете быть уверены, что new
является потокобезопасным.
Хотя память находится в куче, указатель на нее находится в стеке. Указатель на эту память есть только у вашего потока, поэтому нет риска одновременной модификации - никакой другой поток не знает, где находится память, чтобы ее модифицировать.
Проблема с безопасностью потоков возникнет только в том случае, если вы передадите этот указатель другому потоку, который будет параллельно модифицировать эту память одновременно с вашим исходным (или другим) потоком.
Здесь не говорится, что вы можете использовать только стековые переменные, здесь говорится, что использование переменных кучи "предполагает необходимость тщательной проверки на предмет небезопасности".
new
и delete
обычно реализуются потокобезопасным способом (не уверен, что стандарт гарантирует это), так что ваш код выше, вероятно, будет в порядке.
Плюс обычные рекомендации по использованию std::vector
вместо ручного выделения массива, но я полагаю, вы привели это только в качестве примера :)
new и delete могут или не могут быть потокобезопасными . Вероятно, да, но это зависит от реализации. Видеть: Безопасность потоков нового оператора C ++ в linux и gcc 4
Чтобы быть потокобезопасной, функция должна либо использовать переменные стека, либо синхронизировать свой доступ к другим ресурсам с другими потоками. Пока отдельные вызовы new выделяют другое пространство в куче при вызове из разных потоков, все должно быть в порядке.