pthread_key_t和方法pthread_key_create如何工作?

use*_*276 7 pthreads thread-local pthread-key-create

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

是否有一些全局数组或某些东西可以跟踪所使用的所有密钥?

Chr*_*s S 5

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

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

  • 从技术上讲,是的,pthread_key只是一个指向稀疏数组的指针,它是在调用_create函数时创建的.当一个线程调用_setspecific()函数时,它会在数组中填入一个条目,该条目包含线程的ID和函数存储的值(在我的例子中是指向结构的指针).当一个线程调用_getspecific()时,它通过键查找数组,然后通过线程ID查找该数组中的条目,以查找存储的值. (2认同)