在自定义线程实现中存储有关当前线程的信息

时间:2009-08-12 17:26:09

标签: assembly multithreading

我正在尝试使用汇编语言级别的线程。我想存储有关当前线程的信息,包括线程ID等信息。我当前的想法是在一个对齐的地址放置一个指向线程信息结构的指针,例如(ESP & 0xFFE00000)的1MB堆栈。

我看到的直接问题是,如果我希望堆栈超过1MB,则需要特殊处理,因此我想出了另一个选项:将所有线程数据结构存储在链表(或数组)中,并包含开头/ end作为结构的一部分的线程堆栈范围。我会在一个已知地址保留一个指向列表(或数组)头部的指针 - 例如与图像库的固定偏移量。

以下是每个人面临的明显优势:

  • 方法1(对齐地址)
    • 更快地访问信息,无需同步
    • 堆栈必须具有相同的大小并与该边界对齐
  • 方法2(通用存储)
    • 堆栈不必是固定大小,也不必与这么大的边界对齐
    • 但是我必须同步访问数据
    • 但是没有哈希表就没有O(1)访问时间(或者二进制搜索的线程数固定上限 - 偷偷摸摸),哈希表仍然是比直接访问慢

我应该使用其中一种方法,还是有更好的方法可以在我的帖子中访问这些信息?

2 个答案:

答案 0 :(得分:1)

在我知道的至少两个操作系统上对库进行线程化,使用段寄存器来存储指向特定于线程的数据的指针。当然,这主要是一个x86机制,但既然你说你的堆栈指针是ESP,那么我敢打赌那就是你正在使用的架构。无论如何,编译器通常不生成使用段寄存器的代码,并且您正在使用的OS可能将它们保存在上下文交换中。 BSD上的Pthreads使用%fs寄存器。

答案 1 :(得分:0)

构建堆栈中没有与调用框架或推/弹动作相关联的区域是灾难的一个方法。堆栈迟早要比你想象的要大。您将开始使用调用帧作为线程ID,或者线程ID将用作返回地址。

你没有说你正在使用什么线程包,但如果它是PThreads,请看pthread_setspecific。其他线程包应该提供类似的功能。

但从更广泛的意义上说,你的线程需要了解哪些信息呢?如果您(在您的脑海中)将可执行代码与正在执行该代码的环境(线程/进程/其他)分开,则多线程编程变得更加容易。