Как я могу обратить отображение (хеш) `pthread_t`s на указатели структуры? - PullRequest
2 голосов
/ 27 июня 2010

У меня есть тип данных thread в реализации интерпретатора для языка программирования, над которым я работаю. По разным причинам это довольно распространенная операция, когда требуется получить current thread (который сам по себе является указателем: a struct thread*).

Однако pthread_self(3) вручает мне pthread_t, который является непрозрачным типом; в некоторых системах это, похоже, unsigned long, но я слышал, что не могу зависеть от того, что происходит. Я подозреваю, что хеш-таблица является правильной реализацией этого уникального отображения (указатель pthread_t ID на struct thread); тем не менее, я понятия не имею, как хэш pthread_t надежно.

Буду признателен за советы любого, у кого больше опыта работы с pthread(3) или, на самом деле, любой ситуации, в которой вам нужно «хэшировать» непрозрачный тип данных.

1 Ответ

5 голосов
/ 27 июня 2010

Я думаю, что лучший способ сохранить ваш 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);
...