Сегодня мы приехали через проблему относительно статических функций членства в многопоточной среде. Вопрос мы спросили нас и не могли найти, что удовлетворяющий ответ: статичны локальные переменные статических функций членства также?
// header
class A
{
static int test();
}
// implementation
int A::test()
{
int a = rand();
int b = rand();
int c = a + b;
return c;
}
Скажите, что у Вас есть два потока оба вызова A:: тест (). Действительно ли возможно что в то время как поток 1 процесс c = a + b
поток 2 вводит тест () и изменяет значение a
путем присвоения нового возвращаемого значения рэнда () или другими словами оба потока управляют некоторыми ячейками памяти для a, b и c?
Нет. Стековые кадры независимы для каждого потока при вызове функции, и каждый получает свои собственные локали. (Вам нужно быть осторожным, если вы обращаетесь к реальным общим данным, например, к статическим членам класса)
.Нет, 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;
}
Если явно не объявлено как статическое, нет. Они находятся в стеке, и каждый поток имеет отдельный стек.
Классы хранения a, b и c (неявно) являются auto, что обычно означает наличие в стеке вызовов. Они не «наследуют» статический класс хранилища от сигнатуры метода (что является другим значением статического (ура для сильно перегруженных ключевых слов!)).