Читая https://github.com/cosmos72/gls , видим, что на каждое обращение
к TLS нужно блокировать мьютекс. Это плохо. Как сделать лучше?
- можно задать максимальное допустимое значение goid при старте программы и сделать массив. Хотя они говорят, что массивы - не thread-safe (странно, как они умудрились этого добиться). См. немного про безопасность массивов. На худой конец, можно сделать массив указателей на стр-ру, который заполняется в момент запуска программы. Теперь обращение к массиву из горутин будет только для чтения, а указатели на стр-ру принадлежат только одной горутине по построению.
- ещё тупее - завести столько глобальных переменных, сколько возможно goid-ов, и огромный case, который будет выбирать из них одну. Можно даже расширять, если эту ф-ю записать в переменную и обновлять её, когда горутин стало слишком много для старой функции.
- открыть всю структуру g (она находится в src/runtime/runtime2.go и ищется по "type g struct"), как делалось в Дельфи в подобных случаях.
И найти в ней подобающее место. Например, ancestors или m, или gopc.
- есть sync/atomic, хотя атомики - это вроде тоже зло (блокируют системную шину)
- хранить данные в стеке. Для начала, нужно открыть Func struct (живёт в src/runtime/runtime2.go). Затем, сделать замыкание, к-рое будет содержать нужные нам данные. Затем, научиться эти данные видеть через стек. По ходу дела нужно будет научиться читать стек снизу, а не сверху, как сейчас. Или, может быть, просто сделать обычную функцию и передавать объект "хранилище локальных для горутины данных" как параметр. По сути, чтение переменных из стека умеет делать отладчик.
- Написать что-то на Си. Т.е. тупо реализовать массив объектов TLS на Си. Вопрос только, как быть со сборкой мусора.
- Подмена функций - см http://www.alangpierce.com/blog/2016/03/17/adventures-in-go-accessing-unexported-functions/
P.S. С учётом массивной параллельности, надо, чтобы хранилище всё же жило в стеке. В идеальном мире горутины будут выполняться на разных машинах, тогда любое глобальное хранение будет дико дорогим. Вот как обстоит дело с выделением на стеке: https://stackoverflow.com/a/10866871/9469533 - оно есть, но исчезает, как только мы берём адрес. Но теоретически мы можем попытаться достучаться к этим данным через интроспекцию кадров стека.