线程本地和上下文切换

thread local and context switch

本文关键字:上下文切换 线程      更新时间:2023-10-16

我有一些利用线程本地存储的C++代码,每个线程都有一个可以将数据推送到的向量。

我使用 TLS 为每个线程存储索引 ID,这可用于查找将数据推送到哪个向量。然后,它执行相当数量的代码,将数据推送到向量中。

我想知道的是,操作系统是否有可能在获取指向线程本地对象的指针后重新安排我的代码在不同的线程上执行。(到目前为止,代码执行良好,我还没有看到这种情况发生)。 但是如果可能的话,这似乎肯定会破坏我的程序,因为现在两个线程可以具有相同的对象。

假设这是真的,即使对于使用任何复杂 TLS 的任何代码来说,这似乎也是一个问题,TLS 是否仅适用于您不获取地址的简单对象?

谢谢!

线程

本地存储就是这样 - 每个线程的存储。每个线程都有自己的私有数据结构。该线程,无论它在哪个处理器上运行,都是同一线程。操作系统不会在线程内计划工作,而是计划运行哪些线程。

线程

本地存储是通过具有某种间接方式来实现的,该间接寻址会随着线程本身而更改。有几种方法可以做到这一点,例如,操作系统可能在进程中虚拟内存开始的特定偏移处具有特定页面,并且在调度线程时,页表将更新以匹配线程。

在 x86 处理器中,FS 或 GS 通常用于"每线程"数据,因此操作系统将切换 FS 寄存器 [如果是 64 位处理器,则切换寄存器的基址内容]。读取TLS时,编译器将使用FS或GS段寄存器作为内存读/写操作的前缀,因此您始终获得"您的私有数据",而不是其他线程。

当然,操作系统可能有错误,但这是很多东西会依赖的东西,所以如果它坏了,它很快就会出现(除非它非常微妙,你必须站在正确的地方,月亮在正确的相位,穿着正确颜色的衣服,风的方向正确, 日期可被 3 和 7 等除以)。

TLS

表示线程本地,从您的描述来看,每个线程通过 TLS 访问一个共享的矢量向量(我不确定),您应该使用某种锁。任何示例代码?