我在弄清楚 pthread_key_t 和 pthread_key_create 如何工作时遇到了一些麻烦。据我了解,每个线程都有 TLS(线程本地存储),并且一个密钥用于访问线程本地存储。我没有得到的是当一个密钥被创建时,每个线程都可以使用它吗?假设线程 0 创建密钥 0,线程 1 可以使用密钥 0 吗?如果线程 1 使用密钥 0,它会访问自己的 TLS 还是线程 0 的 TLS?
是否有一些全局数组或跟踪所有正在使用的键的东西?
我在弄清楚 pthread_key_t 和 pthread_key_create 如何工作时遇到了一些麻烦。据我了解,每个线程都有 TLS(线程本地存储),并且一个密钥用于访问线程本地存储。我没有得到的是当一个密钥被创建时,每个线程都可以使用它吗?假设线程 0 创建密钥 0,线程 1 可以使用密钥 0 吗?如果线程 1 使用密钥 0,它会访问自己的 TLS 还是线程 0 的 TLS?
是否有一些全局数组或跟踪所有正在使用的键的东西?
pthread_keys 就是你说的,线程本地存储,由一个公共密钥引用。因此多个线程使用相同的密钥,但获得不同的存储空间(每个线程)。
一个简单的例子(也是人为的),假设您正在构建一个异步服务器(如 IMAP)。您可以跟踪数组中的客户端连接,每个连接都有一个当前任务/请求的键。因此,当请求进入时,一个新线程被启动,并且该线程在 Client_Connection->WhatAmIDoing 键中存储一个指向“请求”结构的指针。线程现在不必传递该指针,因为线程执行的任何函数都可以简单地调用 pthread_getspecific() 函数并获取指向它应该执行的操作的指针。