我在解释器实现中有一个thread
数据类型,用于我正在编写的编程语言。由于各种原因,这是一个相当常见的操作,需要获取当前 thread
(它本身就是一个指针:struct thread*
)。
然而,pthread_self(3)
递给我pthread_t
,这是一种不透明的类型;在某些系统上,它似乎是unsigned long
,但我听说我不能依赖于这种情况。我怀疑哈希表是这个唯一映射的正确实现(pthread_t
ID到struct thread
指针);但是,我不知道如何哈希 pthread_t
可靠。
我很感激任何有pthread(3)
经验的人的建议,或者真的,任何你必须“散列”不透明数据类型的情况。
答案 0 :(得分:5)
我认为保留struct thread*
的最佳方式是线程本地存储。类似的东西:
static pthread_key_t struct_thread_key;
pthread_key_create(&struct_thread_key, NULL);
在线程初始化中:
struct thread *my_thread = malloc(sizeof(*my_thread));
// ...
pthread_setspecific(struct_thread_key, my_thread);
稍后访问当前主题:
struct thread *my_thread = (struct thread *) pthread_getspecific(struct_thread_key);