线程实现

3

我想知道如何实现自己的线程库。
我手头有一个基于PowerPC架构的CPU和C标准库。

是否有开源的轻量级实现可供参考?


2
你将需要不仅仅是C标准库,因为你需要能够与硬件中断等进行交互。 - Oliver Charlesworth
我使用Xilinx PowerPC 440 API获得了这个功能。 - socksocket
C11标准库中包含了一个线程库。 - Pubby
我知道,但我想要实现自己的库来学习。 - socksocket
你是在操作系统上运行还是在“裸机”上运行(或者在暴露裸机的操作系统上运行)?C标准库的实现程度有多少? - tc.
显示剩余2条评论
3个回答

2
在其最简单的形式下,线程将需要:
  1. 一些用于堆栈空间的内存
  2. 某个位置来存储其上下文(即寄存器内容、程序计数器、堆栈指针等)
除此之外,您还需要实现一个简单的“内核”,负责线程切换。如果您试图实现抢占式线程,则还需要定期中断源。例如,一个计时器。在这种情况下,您可以在计时器中断中执行线程切换代码。
请查看setjmp()/longjmp()例程以及相应的jmp_buf结构。这将使您轻松访问堆栈指针,以便分配自己的堆栈空间,并为提供线程上下文捕获所有寄存器内容提供简单的方法。
通常,longjmp()函数是返回中断指令的包装器,非常适合在计时器中断中具有线程调度功能。但是,您需要检查平台上longjmp()和jmp_buf的实现。
尝试在较小的微处理器上查找线程实现,这些微处理器通常没有操作系统,例如Atmel AVR或Microchip PIC。例如:AVRFreaks上的讨论

1

为了一个好的线程库,您需要:

  • 原子操作以避免竞争(例如实现互斥锁)
  • 一些操作系统支持进行调度和避免忙等待
  • 一些操作系统支持实现上下文切换

这三个都超出了C99所提供的范围。原子操作在C11中引入,但目前C11实现似乎还没有准备好,因此这些通常是用汇编语言实现的。对于后两个,您必须依赖于您的操作系统。


0
也许你可以看看具有线程支持的C++。我会从选择一些最有用的原语(例如futures)开始,看看它们是如何工作的,并进行简单的实现。

2
C++11之后,C++仅支持本地线程。而且,在裸机环境(即没有操作系统)下编译器可能不支持它。 - Oliver Charlesworth
我不建议他使用它。他正在尝试学习该怎么做。 - usr
哦,我明白了。嗯,我想底层实现会依赖于操作系统的线程 API。 - Oliver Charlesworth
没错,他可以学习未来公共界面的外观。他可以掌握API设计的最佳实践。 - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接