用goto实现绿色线程

实现简单的绿色线程,如果用libpcl:(适用于VC6)

 

 

#include <stdio.h>
#include <string.h>

#include "pcl.h"

static void taskhello(void *arg)
{
	int i;
	for (i = 0; i < 3; i++)
	{
		printf("Hello %d\n", i);
		co_resume();
	}
	*((int *)arg) = 1;
	co_resume();
}

static void taskworld(void *arg)
{
	int i;
	for (i = 0; i < 3; i++)
	{
		printf("World %d\n", i);
		co_resume();
	}
	*((int *)arg) = 1;
	co_resume();
}

int main(int argc, char **argv)
{
	coroutine_t co1, co2;
	int t1 = 0, t2 = 0;
	co_thread_init();
	co1 = co_create(taskhello, &t1, NULL, 32768);
	co2 = co_create(taskworld, &t2, NULL, 32768);
	while(1)
	{
		if (t1 != 1)
		{
			co_call(co1);
		}
		if (t2 != 1)
		{	
			co_call(co2);
		}
		if (t1 == 1 && t2 == 1)
		{
			co_delete(co1);
			co_delete(co2);
			co1 = co2 = NULL;
			break;
		}
	}
	co_thread_cleanup();
	return 0;
}

 

用libtask-win32实现(VC6不支持,需要VC6以上)

 

 

 

#include <stdio.h>
#include "task.h"

static void taskhello(void *arg)
{
	int i;
	for (i = 0; i < 3; i++)
	{
		printf("Hello %d\n", i);
		taskyield();
	}
}

static void taskworld(void *arg)
{
	int i;
	for (i = 0; i < 3; i++)
	{
		printf("World %d\n", i);
		taskyield();
	}
}

void taskmain(int argc, char *argv[])
{
	taskcreate(taskhello, NULL, 0);
    taskcreate(taskworld, NULL, 0);
}

/* output:
Hello 0
World 0
Hello 1
World 1
Hello 2
World 2
*/

 

后来仔细想想,发现如果不用绿色线程(纤程),

那么用goto貌似也能实现(传说中的意大利面条)

 

 

#include <stdio.h>
#include <string.h>

#define TASK_MAX 20

struct task_t {
	int task;
	int state;
};

static void taskhello(void *arg)
{
	static int i[TASK_MAX] = {0};
	int task = ((struct task_t *)arg)->task;
	
	switch(((struct task_t *)arg)->state)
	{
	case -1:
		goto resume_1;
	}

	for (i[task] = 0; i[task] < 3; i[task]++)
	{
		printf("Hello %d\n", i[task]);
		((struct task_t *)arg)->state = -1;
		return;
resume_1:
		;
	}
	((struct task_t *)arg)->state = 1;
}

static void taskworld(void *arg)
{
	static int i[TASK_MAX] = {0};
	int task = ((struct task_t *)arg)->task;

	switch(((struct task_t *)arg)->state)
	{
	case -1:
		goto resume_1;
	}

	for (i[task] = 0; i[task] < 4; i[task]++)
	{
		printf("World %d\n", i[task]);
		((struct task_t *)arg)->state = -1;
		return;
resume_1:
		;
	}
	((struct task_t *)arg)->state = 1;
}

int main(int argc, char **argv)
{
	struct task_t co1;
	struct task_t co2;
	co1.task = 0;
	co2.task = 1;
	co1.state = co2.state = 0;
	while(1)
	{
		if(co1.state != 1)
		{
			taskhello(&co1);
		}
		if(co2.state != 1)
		{
			taskworld(&co2);
		}
		if (co1.state == 1 && co2.state == 1)
		{
			break;
		}
	}
	return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值