У меня есть локальная переменная потока envptr
и переменная, которая не является локальной для потока, также называется envptr
, Последняя переменная используется только в одном потоке, чей исполняемый код не видит объявление локальной переменной потока. Локальная переменная потока используется разными потоками, каждый из которых не видит и не должен видеть объявление нелокальной переменной.
Возможен ли этот сценарий и дает ли он определенное поведение? Я использую Linux 32-разрядной и 64-разрядной на x86.
Это одна и та же переменная или нет? Другими словами, что такое
их связь?
Если он внешний, то нет. Если он внутренний, то все нормально если оба определения не встречаются в одном файле.
Если нет связи, то нет проблем.
Если я что-то не заметил, thread_local
не влияет на связь, поэтому применяются обычные правила (и определение переменной thread_local
в одной единице перевода, а не в другой, является нарушением правила одного определения).
Я думаю, что здесь есть ошибка в стандарте.
Стандарт (§7.1.1 / 1) говорит, что «Если thread_local появляется в любом
объявление переменной должно присутствовать во всех
декларации этой сущности. «Там нет явного заявления
что диагностика не требуется, или что нарушение этого
правило — неопределенное поведение, поэтому компилятор требуется в
диагностировать ошибку Кроме того, конечно, если вы определите в
область имен пространства:
thread_local int i;
в одной единице перевода, и:
int i;
в другом, то компилятор, вероятно, не может диагностировать ошибку
(и я вполне уверен, что комитет не хотел этого требовать).
Я предполагаю, что цель здесь — неопределенное поведение.
Из вашего описания это звучит так, как будто это две разные переменные (ни одна из них никогда не скрывает другую), и в этом случае это выглядит совершенно нормально с технической точки зрения.
Тем не менее, я бы никогда не предложил сделать это, потому что наиболее вероятно, что кто-то запутается в значении будущего обслуживания и вызовет больше проблем при попытке понять код.
Это должно сработать и привести к правильному поведению, поскольку переменные являются двумя разными переменными.
Я настоятельно рекомендую этого не делать, так как это сделает программное обеспечение менее обслуживаемым. Правильно ли это поведение, кажется менее важным, поскольку насколько понятным будет код — использование одного и того же имени переменной для двух наборов данных с совершенно разным поведением кажется проблематичным.