Спецификатор thread_local позволяет определить переменную которая является независимой и имеет собственное значение в разных потоках
#include <iostream> // cout, endl
#include <thread> // thread
thread_local int i = 0; // Переменная i будет независимой в каждом потоке
void set_val(int new_val){ // Функция присваивания переменной i нового значения
i = new_val;
}
void print(){ // Функция вывода значения переменной i из потока
std::cout << i << std::endl; // Вывод значения переменной
}
void threadfunc(int id){ // Функция - обработчкик потока
set_val(id); // Устанавливаем значение переменной i в потоке
i *= i; // Возводим в квадрат значение переменной i в потоке
print(); // Выводим значение переменной i в потоке
}
int main(){
i = 7; // Локальная переменная i
std::thread t1(threadfunc, 2); // Создаем поток t1 с обработчиком threadfunc и начальным значением i = 1
std::thread t2(threadfunc, 3); // Создаем поток t2 с обработчиком threadfunc и начальным значением i = 2
std::thread t3(threadfunc, 4); // Создаем поток t3 с обработчиком threadfunc и начальным значением i = 3
t1.join(); //4 Запускаем поток t1
t2.join(); //9 Запускаем поток t2
t3.join(); //16 Запускаем поток t3
std::cout << i << std::endl; //7 Вывод значения локальной переменной i. Она не затронута потоками.
}