Бывает придет руководитель проекта и, такой: “ребята, делаем однопользовательскую версию %software%, сроки поджимают”.
Ну и делаете, просто, быстро, с кучей глобальных переменных.
И тут внезапно: “ребята, концепт поменялся, надо многопользовательскую”.
Ну и чо теперь делать?
Городить какие-то per-user структуры, в которые запихивать наши глобальные переменные, которые теперь и не очень-то и глобальные и т.п.?
Переписывать весь код, с учетом многопользовательности?
А вот и нет.
Если объявить переменную как
static __thread int variable = 13; // по-старинке
или, что то же самое
static _Thread_local int variable = 13; // как положено
(обязательно static или extern)
То каждый отдельный процесс получит свою собственную копию “глобальной” переменной.
Можно взять указатель на эту переменную и передать его куда угодно, например, в другую задачу, и указатель будет валидным. Переменные хранятся на стеке у всех процессов (включая те, которые про вашу переменную и знать ничего не хотят)
Пример из реальной жизни №1: мониторинг мотора лодочного Yamaha.
Потом, когда все было готово, само-собой понадобилось добавлять второй мотор :))))
Пример из реальной жизни №2: в свое время мне это очень помогло спортировать pppd под RTEMS/powerpc и сделать его многопользовательским: просто добавлением __thread перед глобальными переменными