P.S. Вариант с thread_local без extern ничего не поменяет. Всё равно в src1 и src2 это будут разные объекты.
Тогда не понимаю, о чем ты споришь :)
Смотри
static. Для src1 и src2 - это разные объекты, принадлежащие своим единицам транстяции. thread_local. Для src1 и src2 - это также разные объекты, принадлежащие своим единицам транстяции.
Разница лишь во времени существования. static - существуют все время жизни программы. А thread_local - время жизни потока.
Пусть есть однопоточная либа SRC и ее однопоточное использование:
Ничего необычного. Запустили функцию, которая вызвала изменение "состояния библиотеки" и потом печать. Увидели 12.
А теперь желаем эту либу использовать в многопоточной среде. В самой "либе" меняем static на thread_local. Ну а основную прогу переписываем под многопоточное исполнение: