我有一些使用线程本地存储的C ++代码,每个线程都有一个可以将数据推入的向量。
我使用TLS存储每个线程的索引ID,这可用于查找将数据推入哪个向量。然后它执行相当数量的代码,将数据推送到向量中。
我想知道的是,在获取指向线程本地对象的指针后,操作系统是否可能重新安排我的代码在另一个线程上执行。 (到目前为止代码执行正常,我没有看到这种情况发生)。但是如果可能的话,这似乎肯定会破坏我的程序,因为现在两个线程可能拥有相同的对象。
假设这是真的,即使对于任何使用任何复杂性的TLS的代码来说,这似乎也是一个问题,TLS是否仅适用于不接收地址的简单对象?
谢谢!
答案 0 :(得分:2)
TLS意味着线程本地,从你的描述中,每个线程通过TLS访问向量的共享向量(我不确定),你应该使用某种锁。任何样本代码?
答案 1 :(得分:2)
线程本地存储就是 - 每个线程的存储空间。每个线程都有自己的私有数据结构。该线程,无论运行哪个处理器,都是同一个线程。操作系统不会调度工作在线程,它会调度哪些线程运行。
线程本地存储通过具有某种间接性来完成,该间接性随着线程本身而改变。有几种方法可以做到这一点,例如,OS可能在过程中与虚拟内存的起始位置有特定偏移量的特定页面,并且当调度线程时,更新页面表以匹配线程。
在x86处理器中,FS或GS通常用于“每线程”数据,因此OS将切换FS寄存器[或64位处理器的情况下寄存器的基址的内容]。在读取TLS时,编译器将使用FS或GS段寄存器为存储器读/写操作添加前缀,因此您始终可以获得“您的私有数据”,而不是其他线程。
当然,操作系统可能有错误,但这是很多东西所依赖的东西,所以如果它被破坏了,它很快就会出现(除非它非常微妙,你必须站在右边)地方,月亮在正确的阶段,穿着正确的颜色衣服,风向正确的方向,日期分为3和7等,等等。)