Chinaunix首页 | 论坛 | 博客
  • 博客访问: 923744
  • 博文数量: 201
  • 博客积分: 8078
  • 博客等级: 中将
  • 技术积分: 2162
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-20 17:22
文章分类

全部博文(201)

文章存档

2013年(3)

2012年(11)

2011年(34)

2010年(25)

2009年(51)

2008年(77)

分类:

2009-08-24 17:28:09

int my_puts1(const char *str)
{

    int retval = 0;
    if (*str==0){

        fwrite(str++, 1, 1, stdout);

        retval = my_puts1(str)+1;

    }

    return retval;

}

int my_puts2(const char *str)
{
    const char *p;
    for (p=str; *p; p++)
      fwrite(p, 1, 1, stdout);
    return (p-str);
}

上面的代码对调用者来说,没什么区别(这里只讲设计,不讨论效率问题):
但是对于需要中途需要中断执行,然后保存断点的,显然my_puts2比方式my_puts1更好处理。

单线程, 同步-异步,多线程:

#include <stdio.h>
#include <process.h>
#include <windows.h>

#define MAX_BOOTUP 40
static int _gboot = 0;

static int bootup(int code, int tid)
{
    return printf("bootup-%d: %d\n", tid, code);
}

static void bootupd_single(void *n)
{
    int b;
    for (b=_gboot++; b<MAX_BOOTUP;
            b=_gboot++){
        bootup(b, (int)n);
    }
}

static void bootupd_multi(int cnt)
{
    int j;
    for (j=0; j<cnt; j++)
        _beginthread(bootupd_single, 0, (void*)j);
}

static void bootupd_receiver()
{
    int code;
    for (;;){
        boot_receive(&code);
        boot_answer(code, 0);
        printf("Hello World!\n");
    }
}

static void bootupd_sink()
{
    _beginthread(bootupd_receiver, 0, (void*)j);
    boot_send(0);
    boot_send(1);
    boot_send(2);
    boot_send(3);
}

int main(int argc, char *argv[])
{
    bootupd_single(0);
    printf("--------------------------\n");
    _gboot = 0;
    bootupd_multi(2);
    Sleep(1000);
    bootupd_sink();
    return 0;
}

各方式的执行的的顺序性,一次性不同。

线程 VS 回调(callback/handler)。
线程的start_routing通常只启动一次,回调callback/handler则要调用多次,因为重入性,回调函数最好能尽快的处理完并且减少状态记录性。滥用,乱用线程的除外(这种情况下,这些规则不适用)。
阅读(1098) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~