С++ многопоточные безопасные локальные переменные?
Я знаю, что этот вопрос может казаться дубликатом, но у меня нет ответа, читая другие вопросы.
Моя ситуация - компилятор Visual С++ 2005 из студии экспресс-издания + Windows sdk.
Просто вопрос, если такая функция:
void myFunc()
{
int i=0;
i++;
}
безопасен для вызова из нескольких потоков?
Да, похоже, что это так, но не будет ли компилятор сделать переменную я статической в памяти? Таким образом, это может привести к тому, что два потока действуют вместе в одной области памяти? Или мои страхи - это всего лишь некоторые страхи перед дураком? И все локальные переменные создаются в момент вызова функции?
Ответы
Ответ 1
Да, это потокобезопасно.
i
не будет статическим в памяти, потому что он не является статичным. Если, с другой стороны, вы написали:
void myFunc()
{
static int i = 0;
i++;
}
Тогда он не будет потокобезопасным (ну, если i
был фактически использован).
Локальные переменные все находятся в стеке (или полностью хранятся в регистрах). Каждый поток имеет свой собственный стек, а регистры обрабатываются таким образом, что они по существу локальны для каждого потока (см. Контекстное переключение), поэтому вы в порядке.
Ответ 2
И все локальные переменные создаются в момент вызова функции?
Типичная реализация локальных переменных заключается в их создании в стеке, и каждый поток имеет свой собственный стек, поэтому локальные жители в порядке.
Единственный раз, когда вам нужно следить, когда переменная является сложным типом, потому что в ней может быть логика, которая работает с статическими данными или глобальными данными. Самое хорошее программное обеспечение, конечно же, позволит не писать такие классы.
Ответ 3
Компилятор не может сделать ваши переменные статичными, так как это изменяет семантику программы. Пока вы используете переменные, объявленные только в вашем стеке, вы можете гарантировать безопасность потоков.
Ответ 4
@PeterAlexander, вероятно, ответил на случай, о котором вы беспокоитесь, но в другом случае, когда это было бы не безопасно, если i
была глобальной переменной.