<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Protothreads</id>
	<title>Protothreads - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Protothreads"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Protothreads&amp;action=history"/>
	<updated>2026-07-05T01:12:06Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Protothreads&amp;diff=3327622&amp;oldid=prev</id>
		<title>imported&gt;ExultantEditor 来自 2025年12月26日 (五) 17:36</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Protothreads&amp;diff=3327622&amp;oldid=prev"/>
		<updated>2025-12-26T17:36:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Protothreads&amp;#039;&amp;#039;&amp;#039;是一种低开销的[[并发计算|并发编程]]机制。Protothreads充当[[调用栈|无栈]]的轻量级[[线程]]或[[协程]]，它使用了极小的每protothread内存：一个短整数保存执行位置，一个字节作为让步标志。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
Protothreads可用于实现叫做[[协作式多任务]]的[[抢占式多任务处理|非抢占]]形式的[[并发计算]]，故而在一个线程yield（让步）给另一个线程的时候不会招致[[上下文切换]]。为了在一个protothread内达成yield，在线程函数内利用了[[达夫设备]]并在其{{le|switch语句|Switch statement}}内使用一个函数外部的变量。这允许在另一次函数调用时跳转（恢复）到上次的yield的地方。为了[[阻塞 (计算)|阻塞]]线程，这些yield要通过等待[[条件表达式|条件]]来守卫，使得后续的对同样这个函数的调用仍然yield，直到这个条件表达式是为真值为止。&lt;br /&gt;
&lt;br /&gt;
protothread的概念是{{le|Adam Dunkels|Adam Dunkels}}和Oliver Schmidt开发的&amp;lt;ref&amp;gt;{{cite web|url=http://dunkels.com/adam/pt/|title=Protothreads - Lightweight, Stackless Threads in C|author=Adam Dunkels|date=|website=Dunkels.com|access-date=April 21, 2017|archive-date=2019-12-09|archive-url=https://web.archive.org/web/20191209215203/http://www.dunkels.com/adam/pt/|dead-url=no}}&amp;lt;/ref&amp;gt;，基于了[[Simon Tatham]]&amp;lt;ref&amp;gt;{{Cite web |url=https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html |title=存档副本 |accessdate=2019-11-26 |archive-date=2019-11-09 |archive-url=https://web.archive.org/web/20191109155253/https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html |dead-url=no }}&amp;lt;/ref&amp;gt;和{{le|Tom Duff|Tom Duff}}&amp;lt;ref name=&amp;quot;tatham_duff&amp;quot; /&amp;gt;此前的工作。&lt;br /&gt;
&lt;br /&gt;
==评价==&lt;br /&gt;
Protothreads与其他[[协程]]或纯线程实现有关的特征是它们都是无栈的。这有好处也有坏处。坏处是在protothread内的[[局部变量]]，在经历了yield而再恢复执行之后，不能信任它们仍保留了原来的值。它们要保持自己的状态，就必须通过使用[[静态变量]]或函数外部的变量，经常是[[全局变量]]&amp;lt;ref&amp;gt;A. Dunkels, O. Schmidt, T. Voigt, and M. Ali, [http://doi.acm.org/10.1145/1182807.1182811 &amp;#039;&amp;#039;Protothreads: Simplifying Event-Driven Programming of Memory-Constrained Embedded Systems&amp;#039;&amp;#039;], Proc. ACM [[SenSys]], Boulder, CO, USA, Nov 2006. ([http://dunkels.com/adam/dunkels06protothreads.pdf PDF] {{Wayback|url=http://dunkels.com/adam/dunkels06protothreads.pdf |date=20200728200813 }}, [http://dunkels.com/adam/dunkels06protothreads.ppt Presentation slides] {{Wayback|url=http://dunkels.com/adam/dunkels06protothreads.ppt |date=20200728214755 }})&amp;lt;/ref&amp;gt;。好处是它们是非常轻量级的，因而可用于很多内存受限的系统，就像对于小型[[微控制器]]，其他解决方案可能是不现实的或不是真想要的。&lt;br /&gt;
&lt;br /&gt;
知名于[[达夫设备]]的{{le|Tom Duff|Tom Duff}}，曾评价这种方法的缺点：“探究一种类似在中断驱动的状态机中所用到的技巧太恐怖了。[...] 我从来都不认为它是胜任的通用协程实现，因为要拥有一个协程的多个同时活动是不容易的，并且使用这种方法要使协程在除了在顶层例程内以外任何地方放弃控制权都是不可能的。简单的汇编语言栈交换库就能让你做到这二者。”&amp;lt;ref name=&amp;quot;tatham_duff&amp;quot;&amp;gt;{{Cite web |url=https://brainwagon.org/2005/03/05/coroutines-in-c/#comment-1878 |title=存档副本 |accessdate=2019-11-26 |archive-date=2019-07-23 |archive-url=https://web.archive.org/web/20190723071827/https://brainwagon.org/2005/03/05/coroutines-in-c/#comment-1878 |dead-url=no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==参见==&lt;br /&gt;
* [[协程]]&lt;br /&gt;
* [[纤程]]&lt;br /&gt;
* {{le|微线程|Microthread}}&lt;br /&gt;
&lt;br /&gt;
==引用==&lt;br /&gt;
{{Reflist|2}}&lt;br /&gt;
&lt;br /&gt;
==外部链接==&lt;br /&gt;
*[http://dunkels.com/adam/pt/ Protothread library in C]{{Wayback|url=http://dunkels.com/adam/pt/ |date=20191209215203 }}，用于[[Contiki]]操作系统&lt;br /&gt;
*[http://dunkels.com/adam/dunkels05using.pdf Using Protothreads for Sensor Node Programming]{{Wayback|url=http://dunkels.com/adam/dunkels05using.pdf |date=20181222183423 }}，PDF版论文中有对使用Protothreads的一些深入讨论&lt;br /&gt;
*[http://code.google.com/p/protothread/ Protothread library]{{Wayback|url=http://code.google.com/p/protothread/ |date=20121024072740 }}，要求[[GCC]]，包括了建模在[[UNIX]][[内核]]上的一个[[调度 (计算机)|线程调度器]]（一种简化形式的[[POSIX线程|POSIX]][[監視器 (程序同步化)#条件变量|条件变量]]），这个源代码也包括对多CPU核心（处理器）的支持。&lt;br /&gt;
*[https://github.com/zserge/pt Protothreads (coroutines) in C99. Highly portable, but work best in low-end embedded systems. ]{{Wayback|url=https://github.com/zserge/pt |date=20200807181252 }}&lt;br /&gt;
&lt;br /&gt;
[[Category:执行绪]]&lt;/div&gt;</summary>
		<author><name>imported&gt;ExultantEditor</name></author>
	</entry>
</feed>