Хорошо, скажи, что у меня есть
__thread int myVar;
И затем я передаю &myVar из одного потока в другой... Если данные действительно «локальные», то хранилище TLS 1 потока может не отображаться в адресное пространство других потоков, и на самом деле можно утверждать, что оно < em>не должно быть. Это приведет к SIGSEGV или что-то в этом роде. Однако система может просто сопоставить тот же адрес с другой страницей. Это то, что Linux делает с .tbss/.tdata? В этом случае передача адреса переменной даст вам адрес неправильной переменной! Вы получите свою собственную локальную копию, а не копию, которую пытались передать. Или все совместно используется и сопоставляется с разными виртуальными адресами, что позволяет вам передавать адреса переменных __thread?
Очевидно, что следует бить и выпороть за попытку передать локальное хранилище потока другому потоку, передав его адрес. Есть миллион других способов — например, копирование в любую другую переменную! Но мне было любопытно, знает ли кто-нибудь..
- Чиновник описал поведение в этой ситуации
- Детали текущей реализации GCC/Linux
-- Эван