当前位置: 首页 > 图文教程 > 操作系统 > Unix/Linux > Linux系统与Windows系统的线程有何不同

Unix/Linux
如何在linux下面运行招商银行专业版
Windows和Linux系统共存 完美解决方案
Linux 和对称多处理应用程序介绍
Red Hat Linux 附加引导和内核引导选项
Linux 2.6.11内核文件IO系统调用详解
走向高手之路 Linux系统内核技术解读
菜鸟乐园 Linux系统内核代码特色一览
Linux内核和传统Unix内核的比较
内核中的物理内存分配函数kernel api
使用 Linux 系统调用的内核命令
详细解析 Linux内核的主要配置选项
内核操作 Linux2.6内核驱动移植参考
Linux内存中Swap和Buffer Cache机制
高手进阶 更换Fedora Core 6的内核
高手风范 Linux操作系统内核编码风格
Linux操作系统内核中工作队列的操作
揭开Linux系统内核调试器的神秘面纱
系统“大挪移” Linux服务器迁移大法
高手进阶 重新编译Linux操作系统的内核
Ubuntu系统关于驱动模块命令的一些使用

Unix/Linux 中的 Linux系统与Windows系统的线程有何不同


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-20   浏览: 122 ::
收藏到网摘: n/a

  熟悉WIN32编程的人一定知道,WIN32的进程管理方式与Linux上有着很大区别,在Unix里,只有进程的概念,但在WIN32里却还有一个"线程"的概念,那么Linux和WIN32在这里究竟有着什么区别呢?
  WIN32里的进程/线程是继承自OS/2的。在WIN32里,"进程"是指一个程序,而"线程"是一个"进程"里的一个执行"线索"。从核心上讲, WIN32的多进程与Linux并无多大的区别,在WIN32里的线程才相当于Linux的进程,是一个实际正在执行的代码。但是,WIN32里同一个进程里各个线程之间是共享数据段的。这才是与Linux的进程最大的不同。
  下面这段程序显示了WIN32下一个进程如何启动一个线程。
  int g;
  DWORD WINAPI ChildProcess( LPVOID lpParameter ){
  int i;
  for ( i = 1; i <1000; i ++) {
  g ++;
  printf( "This is Child Thread: %d\n", g );
  }
  ExitThread( 0 );
  };
  void main()
  {
  int threadID;
  int i;
  g = 0;
  CreateThread( NULL, 0, ChildProcess, NULL, 0, &threadID );
  for ( i = 1; i <1000; i ++) {
  g ++;
  printf( "This is Parent Thread: %d\n", g );
  }
  }
  在WIN32下,使用CreateThread函数创建线程,与Linux下创建进程不同,WIN32线程不是从创建处开始运行的,而是由 CreateThread指定一个函数,线程就从那个函数处开始运行。此程序同前面的UNIX程序一样,由两个线程各打印1000条信息。 threadID是子线程的线程号,另外,全局变量g是子线程与父线程共享的,这就是与Linux最大的不同之处。大家可以看出,WIN32的进程/线程要比Linux复杂,在Linux要实现类似WIN32的线程并不难,只要fork以后,让子进程调用ThreadProc函数,并且为全局变量开设共享数据区就行了,但在WIN32下就无法实现类似fork的功能了。所以现在WIN32下的C语言编译器所提供的库函数虽然已经能兼容大多数 Linux/UNIX的库函数,但却仍无法实现fork。
  对于多任务系统,共享数据区是必要的,但也是一个容易引起混乱的问题,在WIN32下,一个程序员很容易忘记线程之间的数据是共享的这一情况,一个线程修改过一个变量后,另一个线程却又修改了它,结果引起程序出问题。但在Linux下,由于变量本来并不共享,而由程序员来显式地指定要共享的数据,使程序变得更清晰与安全。
  至于WIN32的"进程"概念,其含义则是"应用程序",也就是相当于UNIX下的exec了。