LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1214|回复: 1

怎么把linux的fork改成windows下的线程啊?

[复制链接]
发表于 2007-2-5 17:30:24 | 显示全部楼层 |阅读模式
  1. 原型程序如下:
  2. typedef struct list
  3. {
  4.       char * data;
  5.       struct list * next;
  6. } LIST;
  7. LIST  lst; // 已经有一个存在的全局链表了
  8. main()
  9. {
  10.    ......
  11.    a();
  12.    ......
  13.     return;
  14. }
  15. // 由于a是提供给用户的接口,所以不能对a进行修改
  16. void * a()
  17. {
  18.     return get_data(lst);
  19. }

  20. void * get_data(LIST * lplst)
  21. {
  22.     LIST *p;
  23.     if(!lplst) return NULL;
  24.     p = lplst;
  25.     while(p->next)
  26.     {
  27.         int pid;
  28.         if((pid=fork())==0)
  29.         {
  30.              return (void*)p->data;
  31.         }
  32.         else if (pid>0)
  33.         {
  34.             int e, status;
  35.             for(;;)
  36.             {
  37.                 e = waitpid(pid,&status,WNOHANG);
  38.                 if(e<0)
  39.                 {
  40.                     e = waitpid(pid,&status,WNOHANG);
  41.                     break;
  42.                 }
  43.                 usleep(500);
  44.             }
  45.         }
  46.         p=p->next;
  47.     }
  48. }
复制代码

按我的理解,这段程序实际上实现了“一次调用多次返回”这样类似的功能,在main中调用一次a,如果链表中有多个元素,就会有多个返回,而每一个返回,程序都会继续a();语句后面的程序。
而在windows下,似乎没有办法实现类似的功能?通过windows线程,好像不可能做到a()调用完成后对列表里的每个元素,执行a()调用之后的语句。
 楼主| 发表于 2007-2-5 23:51:21 | 显示全部楼层
有没有高手可以帮忙解决一下啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表