保护一个线程的线程本地存储不受其他线程的影响
Protecting thread-local storage of a thread from other threads
线程本地存储是一种在线程间不共享数据的多线程应用程序中 reduce synchronization 开销的方法。这需要围绕某些线程本地内存位置(如 TLS 和堆栈)的保护机制,以便只有一个线程可以访问该内存。由于一个进程中的所有线程共享相同的虚拟地址 space,线程本地存储和线程堆栈如何受到同一进程的其他线程的保护?
我猜想OS应该提供这样的保护机制,如果是,怎么做的? ...线程本地存储的整个概念是减少开销,因此涉及 OS 意味着增加开销。是否有运行时库或硬件支持?或者可能根本没有受到保护,留给程序员...
您认为程序员可以访问同一进程中另一个线程的线程本地存储space是正确的。这不是微不足道的,因为程序员将不得不直接访问内存或使用一些未记录的 API,但理论上可以完成。但是,他(或她)为什么会这样?! TLS 的整个前提是让程序员可以轻松地将数据存储在不与进程内其他线程共享的位置。
线程本地存储由 OS 管理的事实意味着线程本地存储在进程内存中的实际位置没有直接公布。通过提供简单的 Get/Set api,操作系统 "managed" 以相对较低的开销(函数调用)读取和写入 TLS。这里的保护主要是为了方便某些人意外访问属于(也被访问)属于不同线程的数据。
不需要保护机制。事实上,保护机制只会让事情变得更加困难。例如,假设一个线程想要对它的一个对象进行排序,因此它将它传递给一个排序方法。如果该排序方法使用多个线程 "under the hood" 进行排序会怎样?
所以你的问题是基于一个完全错误的前提。这样的保护机制意味着每个对对象进行操作的方法都必须声明对线程特定数据进行操作是否安全,这将是一场噩梦。
线程本地存储是一种在线程间不共享数据的多线程应用程序中 reduce synchronization 开销的方法。这需要围绕某些线程本地内存位置(如 TLS 和堆栈)的保护机制,以便只有一个线程可以访问该内存。由于一个进程中的所有线程共享相同的虚拟地址 space,线程本地存储和线程堆栈如何受到同一进程的其他线程的保护?
我猜想OS应该提供这样的保护机制,如果是,怎么做的? ...线程本地存储的整个概念是减少开销,因此涉及 OS 意味着增加开销。是否有运行时库或硬件支持?或者可能根本没有受到保护,留给程序员...
您认为程序员可以访问同一进程中另一个线程的线程本地存储space是正确的。这不是微不足道的,因为程序员将不得不直接访问内存或使用一些未记录的 API,但理论上可以完成。但是,他(或她)为什么会这样?! TLS 的整个前提是让程序员可以轻松地将数据存储在不与进程内其他线程共享的位置。
线程本地存储由 OS 管理的事实意味着线程本地存储在进程内存中的实际位置没有直接公布。通过提供简单的 Get/Set api,操作系统 "managed" 以相对较低的开销(函数调用)读取和写入 TLS。这里的保护主要是为了方便某些人意外访问属于(也被访问)属于不同线程的数据。
不需要保护机制。事实上,保护机制只会让事情变得更加困难。例如,假设一个线程想要对它的一个对象进行排序,因此它将它传递给一个排序方法。如果该排序方法使用多个线程 "under the hood" 进行排序会怎样?
所以你的问题是基于一个完全错误的前提。这样的保护机制意味着每个对对象进行操作的方法都必须声明对线程特定数据进行操作是否安全,这将是一场噩梦。