2010-08-27 4 views
1

С псевдокодом, как это:Статические свойства в C++

class FooBar { 
public: 
    int property; 
    static int m_static; 
} 

FooBar instance1 = new FooBar(); 
FooBar instance2 = new FooBar(); 

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

Будет ли это также происходить, если экземпляры 1 и 2 находятся в разных потоках?

+0

Если вы обращаетесь к любому объекту из разных потоков, и по крайней мере один поток может изменить объект, вам необходимо синхронизировать доступ к этому объекту (например, с помощью атомарного или мьютекса). –

ответ

9

A static член по существу является глобальной переменной, связанной с классом (а не экземпляром!). Глобальные переменные - это не thread-local, поэтому изменение этой переменной будет отражено во всех потоках.

(BTW, C++ 98 не имеют понятия потоков. В C++ 0x вы можете сделать его поточно-местный (по § 9.4.2/1) с

static thread_local int static_property; 

, но это is not widely supported.)

+1

Стоит отметить, что некоторые IDE предоставляют собственное локальное хранилище потоков, например Visual Studio предоставляет __declspec (thread) или somesuch. – Puppy

2

Да, в программе будет только один экземпляр переменной FooBar::static. Конечно, доступ к одной и той же переменной из потоков по своей сути опасен.

Экземпляры не имеют значения, вы также можете получить доступ к статическому элементу (public) из внешних экземпляров класса.

Примечание: как написано, это не будет скомпилировано, поскольку вы не можете использовать «статические» в качестве имени переменной, это зарезервированное слово.

0

Существует только одна копия статических переменных класса и используется всеми объектами класса, и доступ к ней должен быть синхронизирован, поскольку он не является потокобезопасным.

Смежные вопросы