S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Protothreads

Posted on 2013-05-19 15:12 S.l.e!ep.¢% 阅读(794) 评论(0)  编辑 收藏 引用 所属分类: C++
Protothreads是个好东西,
官网在此 http://www.sics.se/~adam/pt/index.html

二话不说,上代码
#include "pt.h" 
#include 
<stdio.h>
#include 
<stdlib.h>

static  int  countrer;  
 
  
PT_THREAD( example(
struct  pt  *pt1) )  
{  
    
int i = 0;
    PT_BEGIN(pt1);  

    i 
= 100;
    printf(
"before i = %d\n", i);

    PT_WAIT_UNTIL(pt1, countrer 
== 5 );  
    
    printf(
"Threshold reached\n");  
    printf(
"after i = %d\n", i);

    PT_END(pt1);  
}  

int main(void)  
{  
    
static  struct  pt  example_pt; 
    countrer 
= 0;  
    PT_INIT(
&example_pt);  
    
    
while(1)
    {
        
if( PT_ENDED == example(&example_pt) )
            
break;

        countrer
++;  
    }

    
return 0;  
}  

原理很简单, 宏展开就是
#include <stdio.h>
#include 
<stdlib.h>

#define PT_WAITING 0
#define PT_ENDED 3

typedef unsigned 
short lc_t;
struct pt 
{
    lc_t lc;
};

static  int  countrer;  
  
char example(struct  pt  *pt1)
{  
    
int i = 0;

////////////////////////////////////////////////////////////////////////// begin
    { 
        
switch((pt1)->lc) 
        {     
        
case 0:
////////////////////////////////////////////////////////////////////////// -begin

            
while(1
            {  
////////////////////////////////////////////////////////////////////////// call
                do {        
                    (pt1)
->lc = __LINE__; case __LINE__:

                    
if!( countrer == 5 ) ) 
                    {
                        
return PT_WAITING;    
                    }                        
                } 
while(0);
////////////////////////////////////////////////////////////////////////// -call

                printf(
"Threshold reached\n");  
                countrer 
= 0;  
                exit(
1);
            }  

////////////////////////////////////////////////////////////////////////// end
        } 
        (pt1)
->lc = 0;
        
return PT_ENDED;
    }
////////////////////////////////////////////////////////////////////////// -end
}

int main(void)  
{  
    
static  struct  pt  example_pt; 
    countrer 
= 0;  

    (
&example_pt)->lc = 0;
    
    
while(1)
    {
        example(
&example_pt);  
        countrer
++;  
    }

    
return 0;  
}  

有个坏处, 写代码时
 i = 100;                                      <----- 这里赋了值
 printf("before i = %d\n", i);


到了
 printf("Threshold reached\n"); 
 printf("after i = %d\n", i);              <----- 到了这里你还以为i 是 100? 错了....

不过用于解决 
http://www.cppblog.com/sleepwom/archive/2013/05/19/200390.html 
我在这篇文章提出的问题, 提供了一种思路.

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理