【发布时间】:2019-10-17 14:49:00
【问题描述】:
在 Embarcadero c++ 10.1 程序中,我正在使用“new”创建线程的多个实例。在每种情况下,我都需要包含指针和整数的线程特定变量。
我尝试了两种不同的声明:
static TProgram_Control __thread * ptrPC_local;
static int __thread i_local;
和
static __declspec(thread) TProgram_Control * ptrPC_local;
static __declspec(thread) int i_local;
我尝试了使用和不使用“静态”修饰符。我看到两个线程的行为表明每个线程都在破坏彼此的这些变量的值。
我在每个线程中添加了代码来打印出threadID和两个变量的地址
PrintItem("TProg_Control_Thread(" + String(MyPCNo) + "): &ptrPC_local 0x" + IntToHex((int)&ptrPC_local,8));
PrintItem("TProg_Control_Thread(" + String(MyPCNo) + "): &i_local 0x" + IntToHex((int)&i_local,8));
PrintItem("TProg_Control_Thread(" + String(MyPCNo) + "): ThreadID " + IntToHex((int)GetCurrentThreadId(), 8));
这显示在我的调试窗口中,用于线程 (1) 和线程 (2):
TProg_Control_Thread(1): &ptrPC_local 0x00AC4788
TProg_Control_Thread(1): &i_local 0x00AC478C
TProg_Control_Thread(1): ThreadID 00001C34
TProg_Control_Thread(2): &ptrPC_local 0x00AC4788
TProg_Control_Thread(2): &i_local 0x00AC478C
TProg_Control_Thread(2): ThreadID 000014C4
似乎显示唯一的 ThreadID,但两个变量的地址在每个线程中是相同的。
我是否正确理解线程特定变量的概念?我是否应该在每个线程中看到变量的不同地址,以免它们相互干扰?
【问题讨论】:
-
如果您提供minimal reproducible example 会有所帮助。也就是说,您可以使用虚拟内存做很多事情,以便每个线程在同一位置看到其 TLS,但线程切换会映射不同的 RAM 页面来备份它。
标签: c++ multithreading declspec