локальные переменные статических функций членства

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

// 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?

14
задан Holger Kretzschmar 3 March 2010 в 15:52
поделиться

4 ответа

Нет. Стековые кадры независимы для каждого потока при вызове функции, и каждый получает свои собственные локали. (Вам нужно быть осторожным, если вы обращаетесь к реальным общим данным, например, к статическим членам класса)

.
18
ответ дан 1 December 2019 в 12:52
поделиться

Нет, 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;

}
0
ответ дан 1 December 2019 в 12:52
поделиться

Если явно не объявлено как статическое, нет. Они находятся в стеке, и каждый поток имеет отдельный стек.

2
ответ дан 1 December 2019 в 12:52
поделиться

Классы хранения a, b и c (неявно) являются auto, что обычно означает наличие в стеке вызовов. Они не «наследуют» статический класс хранилища от сигнатуры метода (что является другим значением статического (ура для сильно перегруженных ключевых слов!)).

1
ответ дан 1 December 2019 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: