【问题标题】:Threading Implementation线程实现
【发布时间】:2012-03-25 21:28:14
【问题描述】:

我想知道如何实现我自己的线程库。
我拥有的是 CPU(PowerPC 架构)和 C 标准库。

是否有我可以查看的开源轻量级实现?

【问题讨论】:

  • 您需要的不仅仅是 C 标准库,因为您需要能够与硬件中断等交互。
  • 我使用 Xilinx PowerPC 440 API 获得了这种能力
  • 有一个线程库作为 C11 标准库的一部分。
  • 我知道,但我想实现自己的学习库
  • @Pubby,你知道任何已经符合 C11 的编译器吗?另外,C11的螺纹部分是可选的。

标签: c multithreading powerpc


【解决方案1】:

最简单的线程需要:

  1. 一些内存用于堆栈空间
  2. 存储其上下文的位置(即寄存器内容、程序计数器、堆栈指针等)

除此之外,您还需要实现一个负责线程切换的简单“内核”。如果您尝试实现抢占式线程,那么您还需要一个周期性的中断源。例如。计时器。在这种情况下,您可以在定时器中断中执行您的线程切换代码。

看一下 setjmp()/longjmp() 例程,以及对应的 jmp_buf 结构。这将使您可以轻松访问堆栈指针,以便您可以分配自己的堆栈空间,并为您提供一种捕获所有寄存器内容以提供线程上下文的简单方法。

longjmp() 函数通常是从中断指令返回的包装器,它非常适合在定时器中断中具有线程调度功能。不过,您需要为您的平台检查 longjmp() 和 jmp_buf 的实现。

尝试在通常没有操作系统的小型微处理器上寻找线程实现。例如。 Atmel AVR 或 Microchip PIC。 例如:discussion on AVRFreaks

【讨论】:

    【解决方案2】:

    你需要一个像样的线程库:

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

    所有这三个都离开了 C99 为您提供的范围。 C11 中引入了原子操作,到目前为止,C11 的实现似乎还没有准备好,因此这些通常在汇编程序中实现。对于后两者,您必须依赖您的操作系统。

    【讨论】:

      【解决方案3】:

      也许您可以查看支持线程的 C++。我会先挑选一些最有用的原语(例如期货),看看它们是如何工作的,然后做一个简单的实现。

      【讨论】:

      • C++ 从 C++11 开始只有本机线程。用于裸机环境(即无操作系统)的编译器完全有可能不支持它。
      • 我不建议他使用它。他正在努力学习该怎么做。
      • 哦,我明白了。好吧,我想底层实现将依赖于操作系统的线程 API。
      • 是的。尽管如此,他仍然可以了解未来的公共表面是什么样的。他可以学习 API 设计的最佳实践。
      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2015-05-07
      • 2016-01-01
      • 1970-01-01
      • 2021-08-01
      • 2010-12-02
      相关资源
      最近更新 更多