Ответ 1
Нет. Кадры стека независимы для каждого вызова потока функции, и каждый получает свои собственные локали. (Вам нужно быть осторожным, если вы обращаетесь к фактическим общим данным, например, статическим членам в классе.)
Сегодня мы столкнулись с проблемой статических функций-членов в многопоточной среде. Вопрос, который мы задали себе, и не мог найти удовлетворительного ответа: также являются локальными varialbes статических функций-членов?
// header
class A
{
static int test();
}
// implementation
int A::test()
{
int a = rand();
int b = rand();
int c = a + b;
return c;
}
Скажем, у вас есть два потока, вызывающих A:: test(). Возможно ли, что в то время как нить 1 прорабатывает c = a + b
поток 2 входит в test() и изменяет значение a
, назначая новое возвращаемое значение rand(), или, другими словами, оба потока управляют некоторыми ячейками памяти для, b и c?
Нет. Кадры стека независимы для каждого вызова потока функции, и каждый получает свои собственные локали. (Вам нужно быть осторожным, если вы обращаетесь к фактическим общим данным, например, статическим членам в классе.)
Если явно не указано как статическое, нет, они не являются. Они находятся в стеке, и каждый поток имеет отдельный стек.
Класс хранения a, b и c (неявно) авто, который обычно означает в стеке вызовов. Они не "наследуют" статический класс хранения от подписи метода (это другое значение static (yay для сильно перегруженных ключевых слов!)).
Нет, a, b и c не являются статическими.
Вот пример, который иллюстрирует это:
class Val
{
public:
Val() { cout << "Val" << this << endl; }
~Val() { cout << "~Val" << this << endl; }
int n_;
};
class A
{
public:
static int test()
{
Val a;
a.n_ = rand();
Val b;
b.n_ = rand();
Val c;
c.n_ = a.n_ + b.n_;
return c.n_;
}
};
int main()
{
srand(time(0));
for( int i = 0; i < 5; ++i )
{
cout << "Test = " << A::test() << endl;
}
return 0;
}