Похоже, что вы действительно ищете локальное хранилище потоков, которое уже решено гораздо более мобильно, чем это. GCC обеспечивает __thread
, MSVC обеспечивает __declspec(thread)
. boost :: thread предоставляет переносимое локальное хранилище потоков с использованием различных механизмов в зависимости от платформы / набора инструментов и т. Д.
Если вы действительно хотите пойти по этому пути, его можно заставить работать, однако путь чреват опасностями. Восстановление из SIGSEGV - это технически неопределенное поведение, хотя его можно заставить работать на нескольких платформах, оно не является ни надежным, ни переносимым. Вы также должны быть очень осторожны в том, что вы делаете в обработчике сигналов - список асинхронных функций, то есть тех, которые по закону можно безопасно вызывать из обработчика сигналов, очень мал.
В прошлом я несколько раз успешно использовал этот трюк, обычно для пометки «страниц» как «грязных» в пространстве пользователя. Я сделал это, настроив хеш-таблицу, которая содержала базовый адрес всех «страниц» памяти, которые меня интересовали. Когда вы перехватываете SIGSEGV в обработчике, вы можете затем отобразить адрес обратно на страницу с простым арифметические операции. При условии, что хеш-таблица может быть прочитана без блокировок, вы можете найти ее, если вам нужна эта страница, или segfault откуда-то еще и решить, как действовать.