欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux和Windows区别分析之线程问题

程序员文章站 2023-10-18 19:52:40
熟悉WIN32编程的人一定知道,WIN32的进程管理方式与Linux上有着很大区别,在Unix里,只有进程的概念,但在WIN32里却还有一个"线程"的概念,那么Linux和WIN32在这里究竟有着... 09-06-29...

熟悉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了。