С++ многопоточные безопасные локальные переменные?

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

Моя ситуация - компилятор 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 была глобальной переменной.