Потокобезопасность с выделенной кучей памяти - PullRequest
12 голосов
/ 17 мая 2010

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

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

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

Подпрограмма реентерабельна и, следовательно, поточно-ориентирована, если

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

(я понял, что это означает

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

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

, что, согласно ответам ниже, не соответствует действительности)

Ответы [ 3 ]

12 голосов
/ 17 мая 2010

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

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

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

2 голосов
/ 17 мая 2010

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

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

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

1 голос
/ 17 мая 2010

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

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

...