【问题标题】:How does pthread_key_t and the method pthread_key_create work?pthread_key_t 和 pthread_key_create 方法是如何工作的?
【发布时间】:2012-02-18 19:52:58
【问题描述】:

我在弄清楚 pthread_key_t 和 pthread_key_create 如何工作时遇到了一些麻烦。据我了解,每个线程都有 TLS(线程本地存储),并且一个密钥用于访问线程本地存储。我没有得到的是当一个密钥被创建时,每个线程都可以使用它吗?假设线程 0 创建密钥 0,线程 1 可以使用密钥 0 吗?如果线程 1 使用密钥 0,它会访问自己的 TLS 还是线程 0 的 TLS?

是否有一些全局数组或其他东西可以跟踪所有正在使用的键?

【问题讨论】:

  • 对于新手,我建议阅读The Linux Programming Interface一书的31: Threads: Thread Safety and Per-Thread Storage,你会在那里得到你所有的答案。

标签: pthreads thread-local pthread-key-create


【解决方案1】:

pthread_keys 就是你说的,线程本地存储,由一个公共密钥引用。因此多个线程使用相同的密钥,但获得不同的存储空间(每个线程)。

一个简单的例子(也是人为的),假设您正在构建一个异步服务器(如 IMAP)。您可以跟踪数组中的客户端连接,每个连接都有当前任务/请求的键。因此,当请求进入时,新线程会启动,并且该线程会在 Client_Connection->WhatAmIDoing 键中存储一个指向“请求”结构的指针。线程现在不必传递该指针,因为线程执行的任何函数都可以简单地调用 pthread_getspecific() 函数并获取指向它应该执行的操作的指针。

【讨论】:

  • 因此,查看 pthread_key_create 的源代码,它将 pthread_key_t 内的一个名为 key 的变量设置为从 TlsAlloc 返回的任何内容。 Key 是一个指针,但是 TlsAlloc 返回的是什么?它只是每个线程的空槽数组吗?另外,如果每个线程都有自己的 Tls 空间,那么数组中的每个元素是否只指向线程 Tls 空间?我只是在某个地方感到困惑,我不知道在哪里。也许我让这变得比它需要的更复杂。
  • 从技术上讲是的,pthread_key 只是一个指向稀疏数组的指针,它是在调用 _create 函数时创建的。当一个线程调用 _setspecific() 函数时,它用线程的 ID 和函数存储的值(在我的示例中是指向结构的指针)填充数组中的一个条目。当线程调用 _getspecific() 时,它通过键查找数组,然后通过线程 ID 查找该数组中的条目,以查找存储的值。
  • 请记住这些接口的重点是抽象幕后发生的事情,因此您的程序不依赖于平台/实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 2019-05-20
  • 2012-04-21
  • 2016-07-26
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多