保护线程的线程本地存储与其他线程

时间:2015-06-22 20:26:00

标签: multithreading operating-system thread-local-storage

线程局部存储是多线程应用程序中reduce synchronization开销的一种方法,其中数据不在线程之间共享。这需要围绕某些线程本地存储器位置(如TLS和堆栈)的保护机制,以便只有一个线程可以访问该存储器。由于进程中的所有线程共享相同的虚拟地址空间,因此如何保护线程本地存储和线程堆栈免受同一进程的其他线程的影响?

我想OS应该提供这样的保护机制,如果是这样,怎么样? ...线程本地存储的整个概念是减少开销,因此涉及OS意味着增加开销。是否有运行时库或硬件支持?或者根本不受保护,留给程序员......

2 个答案:

答案 0 :(得分:1)

您认为程序员可以访问同一进程中的另一个线程的线程本地存储空间是正确的。它不会是微不足道的,因为程序员必须直接访问内存或使用一些未记录的API,但理论上可以完成。但是,为什么他(或她)?! TLS的整个前提是让程序员可以轻松地将数据存储在不与流程中其他线程共享的位置。

线程本地存储由OS管理的事实意味着不直接通告进程存储器中的线程本地存储的实际位置。读取和写入TLS是"管理"通过提供简单的Get / Set api,具有相对较低的开销(函数调用)的操作系统。这里的保护主要是方便,因为某人很难意外地访问由不同线程所属(也被访问)的数据。

答案 1 :(得分:0)

它不需要保护机制。事实上,保护机制只会让事情变得更加困难。例如,假设某个线程要对其中一个对象进行排序,那么它会将其传递给排序方法。如果排序方法使用多个线程"引擎盖下会发生什么?做排序?

所以你的问题是基于一个完全错误的前提。这样的保护机制意味着对对象进行操作的每个方法都必须声明是否可以安全地操作特定于线程的数据,这将是一场噩梦。