Потокобезопасность с памятью типа "куча"

Я читал это: 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;
}

В статье это говорит, что, чтобы быть ориентированными на многопотоковое исполнение можно только использовать переменные от стека.В самом деле? Почему? Не был бы последующие вызовы вышеупомянутой функции выделять память в другом месте?

Править: А-ч. Похож я неправильно читал эту часть статьи:

Подпрограмма повторно используема, и таким образом ориентирована на многопотоковое исполнение, если

  • единственные переменные, которые это использует, от стека

(Я взял его для значения

Подпрограмма повторно используема, и таким образом ориентирована на многопотоковое исполнение, если и только если

  • единственные переменные, которые это использует, от стека

, который согласно ответам ниже, не имеет место),

12
задан Cam 17 May 2010 в 00:02
поделиться

3 ответа

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

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

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

13
ответ дан 2 December 2019 в 20:16
поделиться

Здесь не говорится, что вы можете использовать только стековые переменные, здесь говорится, что использование переменных кучи "предполагает необходимость тщательной проверки на предмет небезопасности".

new и delete обычно реализуются потокобезопасным способом (не уверен, что стандарт гарантирует это), так что ваш код выше, вероятно, будет в порядке.

Плюс обычные рекомендации по использованию std::vector вместо ручного выделения массива, но я полагаю, вы привели это только в качестве примера :)

2
ответ дан 2 December 2019 в 20:16
поделиться

new и delete могут или не могут быть потокобезопасными . Вероятно, да, но это зависит от реализации. Видеть: Безопасность потоков нового оператора C ++ в linux и gcc 4

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

1
ответ дан 2 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

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