Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将(hash)`pthread\u t`反向映射到结构指针?_C_Data Structures_Hashtable_Pthreads - Fatal编程技术网

C 如何将(hash)`pthread\u t`反向映射到结构指针?

C 如何将(hash)`pthread\u t`反向映射到结构指针?,c,data-structures,hashtable,pthreads,C,Data Structures,Hashtable,Pthreads,我在一种编程语言的解释器实现中有一个线程数据类型。出于各种原因,这是一个相当常见的操作,需要获取当前线程,它本身就是一个指针:一个结构线程* 但是,pthread_self3递给我一个pthread_t,它是一个不透明类型;在某些系统上,它似乎是一个无符号的长字符,但我听说我不能依赖于这种情况。我怀疑哈希表是这个唯一映射pthread\u t ID到struct thread指针的正确实现;但是,我不知道如何可靠地散列pthread\u t 如果您对pthread3有更多经验,或者在任何情况下必

我在一种编程语言的解释器实现中有一个线程数据类型。出于各种原因,这是一个相当常见的操作,需要获取当前线程,它本身就是一个指针:一个结构线程*

但是,pthread_self3递给我一个pthread_t,它是一个不透明类型;在某些系统上,它似乎是一个无符号的长字符,但我听说我不能依赖于这种情况。我怀疑哈希表是这个唯一映射pthread\u t ID到struct thread指针的正确实现;但是,我不知道如何可靠地散列pthread\u t


如果您对pthread3有更多经验,或者在任何情况下必须“散列”不透明数据类型,我将非常感谢您的建议。

我认为保存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);

如果它是不透明类型,你真的不能对它进行散列,因为你不知道它有多大。我不熟悉本地存储,但这可能会有问题:线程必须可以从其他执行线程访问:它是一个一流的数据类型,可以自由传递。它只获取当前正在执行的执行线程的线程,作为一级引用,这是有问题的…@elliott,在调用getspecific之后,您可以传递我的线程。当然,您可能仍然需要进行同步。@elliottcable:这应该可以,因为在本例中,指向结构线程的指针是线程本地的;结构线程本身是用malloc分配的,所以它是全局的;您所说的是在每个线程的线程特定内存中存储一个指向共享内存的指针,该内存存储对该线程的线程结构数据类型的引用。完美的我从未考虑过一个不使用pthread_self3的解决方案,这真是天才。谢谢如果是,可以传递struct-thread*。您可以向&my_thread传递一个struct thread**,因为所有指针都可以从void*转换到void*。然而,我看不出有什么理由。pthread不应该在内部解除对指针的引用,只需要传递它。