uIP原始线程

  • 格式:doc
  • 大小:41.00 KB
  • 文档页数:3

uIP原始线程(protothreads)
原始线程是极端轻量级的、无需堆栈的线程。

它在事件驱动的系统上层提供阻塞上下文,无需为每个线程提供堆栈的开销。

原始线程的目标是在没有复杂的状态机或多线程的情况下实现控制顺序流。

原始线程在C函数内部实现了条件阻塞。

原始线程相对于多线程的优势在于原始线程是相当轻量极的,原始线程不需要自己的堆栈。

相反,所有的线程都运行在同一个堆栈中,上下文的切换是通过堆栈的回转实现的。

原始线程的每条线程只需两字节,而且原始线程是纯用C实现的,不需要任何机器有关的汇编语言代码。

一个原始线程在一个C语言函数中运行,不能跨过多个函数。

原始线程可以调用普通的C语言函数,在调用的C语言函数不能阻塞。

嵌套调用的函数内部的阻塞是通过为可以阻塞的函数产生一人新的线程来实现的。

这种方法的优点是阻塞是明确的,程序员确切的知道哪些函数是可以阻塞的,哪些函数是永远也不会阻塞的。

原始线程无需堆栈。

原始线程在C函数内部实现阻塞上下文。

由于原始线程有阻塞调用中中不需保存堆栈上下文,原始线程阻塞时,局部变量也不再保留。

这意味着局部变量的使用必须十分小心。

如果不确定的话,尽量不要有原始线程中使用局部变量。

调度:
原始线程是通过重复调用宿主函数驱动的。

每调用宿主函数一次,原始线程都会运行到阻塞或退出为止。

这样说来,原始线程的调度是由使用原始线程的应用做到的。

实现:
原始线程的实现采用了"local continuation"机制."local continuation"代表的是一个程序在某个位置的当前执行状态,但不提供任何调用历史或局部变量."local continuation"可以在指定函数内设定,以捕获程序的状态."local continuation"设定后可以恢复,以复原"local continuation"设定时函数的状态。

标准C语言的实现方式每个线程只需要2字节,它以一种不明显的方式优化了C语言中的switch()语句,然而,这种实现对使用原始线程的代码稍有限制,不能在代码中使用switch()语句。

文件:
ft.h原始线程的实现。

模块:
Local continuation实现原始线程的基础。

数据结构:
struct pt
初始化:
#define PT_INIT(pt) 初始化原始线程。

声明和定义:
#define PT_THREAD(name_args) 声明原始线程。

#define PT_BEGIN(pt) 在要实现原始线程的函数内部声明原始线程的开始。

#define PT_END(pt) 声明原始线程的结尾。

阻塞等待:
#define PT_WAIT_UNTIL(pt,condition) 等待直到条件为真。

#define PT_WAIT_WHILE(pt,cond) 等待只要条件为真。

分级的原始线程:
#define PT_WAIT_THREAD(pt,thread) 阻塞等待子线程完成。

#define PT_SPAWN(pt,child,thread) 产生子进程并等待其结束。

#define PT_RESTART(pt) 重启原始线程。

调用原始线程:#define PT_SCHEDULE(pt) 高度原始线程。

原始线程让位:
#define PT_YIELD(pt) 当前原始线程让位(即暂时中止,让别的线程先执行)。

#define PT_YIELD_UNTIL(pt) 面前原始线程让位,直到条件为真。

#define PT_WAITING 0
#define PT_ENDED 2
#define PT_YIELDED 3
1.#define PT_BEGIN(pt)
在实现原始线程的C函数中声明原始线程开始。

此宏用于声明原始线程的开始点.应该把它放在使用原始线程的函数的开头儿。

放在此句之前的C语句每次原始线程的调度都会执行一次。

参数:
pt 指向线程控制结构的指针。

2.#define PT_END(pt) 声明原始线程的结尾
此宏用于声明原始线程的结尾,它通常必须与PT_BEGIN()宏匹配使用。

参数:
pt 指向原始线程控制结构的指针。

3.#define PT_EXIT(pt) 退出原始线程。

此宏使用始线程退出.如果退出的线程是一个子线程,
则其父线程结束阻塞状态,得以继续运行。

参数:
pt 指向原始线程控制结构的指针。

4.#define PT_INIT(pt)
初始化原始线程.初始化必须在使用之前完成.参数:
pt 指向原始线程控制结构的指针。

5.#define PT_RESTART(pt) 重启原始线程,此宏会致使运行的线程从PT_BEGIN()处重新开始执
行。

参数:
pt 指向原始线程控制结构的指针。

6.#define PT_SCHEDULE(f)调试线程,此函数调度线程,如果调度的线程在运行则此函数返回非
零值,如已经退出,则返回零值。

参数:
f 要调度的线程的宿主函数的调用。

7.#define PT_SPAWN(pt,child,thread) 此宏用于产生一个子线程并等待直到子线程的退出。


只能用于线程内部。

参数:
pt 指向线程控制结构的指针。

child 指向子线程的控制结构的指针。

带参数的子线程。

8.#define PT_THREAD(name_args)
此宏用于声明原始线程,所有的原始线程都必须由此声明。

9.#define PT_WAIT_THREAD(pt,thread) 阻塞并等待子线程无成。

这个宏调度了一个子线程,并等待子线程的完成。

注意:
在此函数使用之前,子原始线程必须通过PT_INIT()初始化。

参数:
pt 指向原始线程控制结构体的指针。

thread 带有参数的子线程。

10.#define PT_WAIT_UNTIL(pt,condition)
阻塞等待,直到条件为真。

此宏阻塞线程直到指定的条件为真。

参数:
pt 指向原始线程控制结构体的指针。

condition 指定的条件.
11. #define PT_WAIT_WHILE(pt,cond)
阻塞等待,直到条件为真。

此宏阻塞线程只要指定的条件为真。

参数: pt 指向原始线程控制结构体的指针。

condition 指定的条件。

12. #define PT_YIELD(pt)
从当前线程中让位。

这个函数会让当前线程让位,从而使其它线程先在系统中运行。

参数:
pt 指向原始个线程控制结构体的指针。

13.#define PT_YEILD_UNTIL(pt,cond)
使当前线程让位,直到某条件发生。

参数:
pt 指向原始线程控制结构的指针。

cond 条件。

此函数会让当前线程让位,直到某条件为真。