@simply_user

Почему статическая переменная в классе имеет одинаковое значение во всех потоках?

Здравствуйте!
Если я правильно понимаю статическая переменная класса т.к она находиться на стеке, должна быть у каждого потока своя, и изменение этой переменной в одном потоке не должно изменять её значение в другом. Тогда почему работает представленный код? Смысл этого кода заключается в том, что при изменении статической переменной flag класса SomeClass на true, в других потоках происходит выход из цикла по условию. Но ведь изменение статической переменной в одном потоке не должно влиять на её значение в другом?
Заранее спасибо.
#include <thread>
#include <mutex>
#include <iostream>
#include <locale>

using namespace std;

mutex printMutex;

#define PRINT(text) { lock_guard<mutex> guardPrintMutex(printMutex); cout<<text<<endl;}

class SomeClass
{
public:
	static bool flag;
};

bool SomeClass::flag = false;

void main()
{
	setlocale(LC_ALL, "Russian");

	thread th1([]()
	{
		PRINT("Первый поток начат");
		for (int i = 0; i < 100000; i++)
		{
			if (i == 99999)
			{
				SomeClass::flag = true;
				PRINT("Первый поток завершён.");
			}
		}
	});

	thread th2([]()
	{
		PRINT("Второй поток начат");
		while (true)
		{
			if (SomeClass::flag)
			{
				PRINT("Второй поток завершён.");
				break;
			}
		}
	});

	thread th3([]()
	{
		PRINT("Третий поток начат");
		while (true)
		{
			if (SomeClass::flag)
			{
				PRINT("Третий поток завершён.");
				break;
			}
		}
	});

	th1.join();
	th2.join();
	th3.join();
	system("pause");
}
  • Вопрос задан
  • 3398 просмотров
Пригласить эксперта
Ответы на вопрос 4
Статические переменные располагаются не на стеке, а в области данных. Там же, где и глобальные переменные. Для того, чтобы объявлять потокоспецифичные переменные C++11 ввели спецификатор thread_local.
Ответ написан
Комментировать
Если я правильно понимаю статическая переменная класса т.к она находиться на стеке, должна быть у каждого потока своя

Неправильно
Ответ написан
@vilgeforce
Раздолбай и программист
Статические члены класса едины для всех экземпляров класса.
Ответ написан
Комментировать
AxisPod
@AxisPod
Теперь берем книжку C++ для чайников и читаем.

Ну и второе, использовать статическую переменную для остановки треда, это выстрел себе в ногу. При отимизиции и без вы словите разное поведение. Как минимум нужно пометить как volatile (при этом при использовании static переменная будет подвержена оптимизации, в итоге опять будет работать неправильно). А если использовать C++11, то уже лучше std::atomic_flag или std::atomic.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы