一个原始线程在一个C语言函数中运行,不能跨过多个函数。原始线程可以调用普通的C语言函数,在调用的C语言函数不能阻塞。嵌套调用的函数内部的阻塞是通过为可以阻塞的函数产生一人新的线程来实现的。这种方法的优点是阻塞是明确的,程序员确切的知道哪些函数是可以阻塞的,哪些函数是永远也不会阻塞的。
原始线程与不对称的协同程是相似的,主要的不同在于协同程序为每个协同程序使用单独的堆栈而原始线程无需堆栈。与原始线程最相似的机制是Python产生器。这些产生器也是无堆栈的结构,但用途不同。原始线程在C函数内部实现阻塞上下文,而python产生器从产生函数中提供了多个退出点。 局部变量: 注意:
由于原始线程有阻塞调用中中不需保存堆栈上下文,原始线程阻塞时,局部变量也不再保留。这意味着局部变量的使用必须十分小心。如果不确定的话,尽量不要有原始线程中使用局部变量。 调度:
原始线程是通过重复调用宿主函数驱动的。每调用宿主函数一次,原始线程都会运行到阻塞或退出为止。这样说来,原始线程的高度是由使用原始线程的应用做到的。 实现:
原始线程的实现采用了\机制.\代表的是一个程序在某个位置的当前执行状态,但不提供任何调用历史或局部变量.\可以在指定函数内设定,以捕获程序的状态.\continuation\设定后可以恢复,以复原\设定时函数的状态. \的实现的多种方法: 1. 使用机器相关的汇编语言 2. 使用标准C结构体. 3.使用编译器扩展.
第一种方式通过保存和恢复处理器状态实现,所说的处理器状态不包括堆栈指针.这种方式每个原始线程需要16到32个字节的内存空间,具体是多少与处理器构架有关.
标准C语言的实现方式每个线程只需要2字节,它以一种不明显的方式优化了C语言中的switch()语句,这与Duff的设备类似.然而,这种实现对使用原始线程的代码稍有限制,不能在代码中使用switch()语句.
某些编译器有C语言的扩展也可以实现原始线程.比如说GCC支持标签指针,这就可以用于此目的.在这种实现方式下,每个原始线程需要4字节内存.
说实话,以上的内容没读懂,大家报着怀疑的态度去看,英语好的直接看原英文版吧. 文件:
原始线程的实现 模块:
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_EXIT(pt) 退出原始线程
调用原始线程:#define PT_SCHEDULE(pt) 高度原始线程 原始线程让位:
#define PT_YIELD(pt) 当前原始线程让位(即暂时中止,让别的线程先执行). #define PT_YIELD_UNTIL(pt) 面前原始线程让位,直到条件为真. 定义:
#define PT_WAITING 0 #define PT_EXITED 1 #define PT_ENDED 2 #define PT_YIELDED 3
翻译的不好,大家多多包涵~
1. #define PT_BEGIN(pt)在实现原始线程的C函数中声明原始线程开始.
此宏用于声明原始线程的开始点.应该把它放在使用原始线程的函数的开头儿.放在此句之前的C语句每次原始线程的调度都会执行一次. 参数:
pt 指向线程控制结构的指针 应用例程: .
定义于的115行.
2. #define PT_END(pt) 声明原始线程的结尾
此宏用于声明原始线程的结尾,它通常必须与PT_BEGIN()宏匹配使用. 参数:
pt 指向原始线程控制结构的指针. 应用例程: .
定义于的127行.
3. #define PT_EXIT(pt) 退出原始线程
此宏使用始线程退出.如果退出的线程是一个子线程,则其父线程结束阻塞状态,得以继续运行. 参数:
pt 指向原始线程控制结构的指针. 定义于的246行.
4. #define PT_INIT(pt)
初始化原始线程.初始化必须在使用之前完成.参数: pt 指向原始线程控制结构的指针. 见:PT_SPAWN() 应用例程: .
定义于的80行. 引用于
httpd_appcall().
5. #define PT_RESTART(pt)
重启原始线程.此宏会致使运行的线程从PT_BEGIN()处重新开始执行. 参数:
pt 指向原始线程控制结构的指针.
应用例程: .
定义于的229行.
6. #define PT_SCHEDULE(f)调试线程,此函数调度线程,如果调度的线程在运行则此函数返回非零值,如已经退出,则返回零值. 参数:
f??要调度的线程的宿主函数的调用. 定义于的271行.
7. #define PT_SPAWN(pt,child,thread) 此宏用于产生一个子线程并等待直到子线程的退出 .它只能用于线程内部. 参数:
pt 指向线程控制结构的指针. child 指向子线程的控制结构的指针. 带参数的子线程. 定义于的206行.
8.#define PT_THREAD(name_args)
此宏用于声明原始线程,所有的原始线程都必须由此声明. 应用例程: 和.
定义于的100行.
9. #define PT_WAIT_THREAD(pt,thread) 阻塞并等待子线程无成.
这个宏调度了一个子线程,并等待子线程的完成 . 注意:
在此函数使用之前,子原始线程必须通过PT_INIT()初始化. 参数:
pt 指向原始线程控制结构体的指针. thread 带有参数的子线程. 定义于的192行.
10. #define PT_WAIT_UNTIL(pt,condition) 阻塞等待,直到条件为真.
此宏阻塞线程直到指定的条件为真. 参数:
pt 指向原始线程控制结构体的指针. condition 指定的条件.
应用例程: .
定义于的148行.
11. #define PT_WAIT_WHILE(pt,cond) 阻塞等待,直到条件为真.
此宏阻塞线程只要指定的条件为真. 参数:
pt 指向原始线程控制结构体的指针.
condition 指定的条件. 定义于的167行.
12. #define PT_YIELD(pt) 从当前线程中让位.
这个函数会让当前线程让位,从而使其它线程先在系统中运行. 参数:
pt 指向原始个线程控制结构体的指针. 应用例程: .
定义于的290行.
13. #define PT_YEILD_UNTIL(pt,cond) 使当前线程让位,直到某条件发生. 参数:
pt 指向原始线程控制结构的指针. cond 条件.
此函数会让当前线程让位,直到某条件为真. 定义于的310行.
UIP中文文档第七 uIP编译时配置选项
详细说明:uIP针对每个工程都可以通过进行配置.
这个文件包含了uIP的所有编译时选项,应该针对每一个工程对这些选项进行调整.uIP的发行版包含了一个文档化的文件,用户可以复制和修改这个文件来达到调整选项的目的. 注意:
中的大部分内容都不必修改,反而是需要的修改较多.
相关文件:
uip配置文件. uip配置选项
针对于工程的配置选项:
uip有大量的配置选项,它们都可以根据工程需要重载.它们被保存在一个工程相关的文件中,所有配置的名称都有UIP_CONF前辍.
#define UIP_CONF_MAX_CONNECTIONS 最大的TCP连接数.
#define UIP_CONF_MAX_LISTENPORTS??最大监听的TCP端口数. #define UIP_CONF_BUFFER_SIZE uip 缓冲区大小. #define UIP_CONF_BYTE_ORDER CPU字节顺序. #define UIP_CONF_LOGGING 是否开启日志 #define UIP_CONF_UDP 是否启用UDP功能