我有一个线程局部变量envptr
和非线程局部变量,也称为envptr
. 后一个变量仅在运行代码看不到线程局部变量声明的单个线程中使用。线程局部变量被不同的线程使用,每个线程看不到也不需要看到非线程局部变量的声明。
这种情况是否可能并产生定义的行为?我在 x86 上使用 linux 32 位和 64 位。
我有一个线程局部变量envptr
和非线程局部变量,也称为envptr
. 后一个变量仅在运行代码看不到线程局部变量声明的单个线程中使用。线程局部变量被不同的线程使用,每个线程看不到也不需要看到非线程局部变量的声明。
这种情况是否可能并产生定义的行为?我在 x86 上使用 linux 32 位和 64 位。
它们是同一个变量吗?换句话说,它们的联系是什么?
如果是外部的,那么没有。如果它是内部的,那么除非这两个定义都出现在同一个文件中,否则就可以了。
如果没有联动,那么就没有问题。
除非我忽略了某些东西,否则thread_local
对链接没有影响,所以通常的规则适用(并且thread_local
在一个翻译单元而不是另一个翻译单元中定义变量是违反单一定义规则的)。
但是,我认为这里的标准存在错误。标准(第 7.1.1/1 节)说“如果 thread_local 出现在变量的任何声明中,它应该出现在该实体的所有声明中。” 没有明确声明不需要诊断,或者违反此规则是未定义的行为,因此需要编译器来诊断错误。当然,如果您在命名空间范围内定义:
thread_local int i;
在一个翻译单元中,并且:
int i;
在另一种情况下,编译器可能无法诊断错误(我很确定委员会不想要求它)。我的猜测是这里的意图是未定义的行为。
这应该有效,并产生正确的行为,因为变量是两个不同的变量。
我强烈建议不要这样做,因为它只会降低软件的可维护性。这种行为是否正确似乎不如代码的可理解性那么重要——对行为截然不同的两组数据使用相同的变量名似乎是有问题的。
根据您的描述,听起来它们是两个不同的变量(一个都不会影响另一个),在这种情况下,从技术角度来看它似乎完全可以。
也就是说,我永远不会建议这样做,因为最有可能发生的事情是有人会对未来维护中的含义感到困惑,并且会导致试图理解代码时出现更多问题。