LinuxSir.cn,穿越时空的Linuxsir!

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

一个多线程程序,为什么从结果上看不到两个线程是并行执行的?

[复制链接]
发表于 2006-7-20 09:03:18 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <pthread.h>
void thread (void)
{
int i,a[100],pid;
a[0]=1;
a[1]=1;
for (i=2;i<100;i++)
  {a=a[i-1]+a[i-2];
   pid=getpid();
   printf("This is a thread and the %dth result is %d\n",i-1,a);
   printf("pid is %d\n",pid);
  }

}
int main(void)
{
  pthread_t thread1,thread2;
  int i,j,k,pid1;
  j=pthread_create(&thread1,NULL,(void *)thread,NULL);
  k=pthread_create(&thread2,NULL,(void *)thread,NULL);
  if(j!=0||k!=0 )
   {
    printf("Creat pthread error!\n");
    //exit(1);
   }
  for (i=0;i<3;i++)
  {
   printf("This is the main process\n");
   pid1=getpid();
   printf("The main process id is %d\n",pid1);
   pthread_join(thread1,NULL);
   pthread_join(thread2,NULL);
  }
   return(0);
}
执行的结果始终是先打印一个线程的结果,再打印另一个线程的结果,为什么不是交替打印?只有交替打印才能显示两个线程是并行的啊。
发表于 2006-7-20 11:15:33 | 显示全部楼层
只累加到100?  一个时间片还没用完线程就结束了吧。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-20 14:51:44 | 显示全部楼层
即使累加到100000也是一样啊,如果让线程sleep(1)那么结果就是对的,为什么呢?
回复 支持 反对

使用道具 举报

发表于 2006-7-21 08:56:41 | 显示全部楼层
还没研究这个,不懂
回复 支持 反对

使用道具 举报

发表于 2006-7-21 10:06:07 | 显示全部楼层
printf is buffered. try fprintf( stderr, .. ).
回复 支持 反对

使用道具 举报

发表于 2006-7-23 22:47:10 | 显示全部楼层
钱程中getpid()是什么意思!!!
回复 支持 反对

使用道具 举报

发表于 2006-7-24 14:50:20 | 显示全部楼层
不知道这和盲等有什么区别。线程的调度远不如进程调度那么“均匀”与灵活。假如一个线程出现盲等,那么很有可能导致其它线程得不到调度。sleep的作用就是给其它线程调度机会。
回复 支持 反对

使用道具 举报

发表于 2006-7-28 11:58:59 | 显示全部楼层
Post by newroot
钱程中getpid()是什么意思!!!

取得当前进程的进程号
回复 支持 反对

使用道具 举报

发表于 2006-7-30 17:03:10 | 显示全部楼层
  1. /* example.c*/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <pthread.h>
  5. void thread(void)
  6. {
  7.         int i;
  8.         for(i=0;i<30;i++)
  9.         {
  10.                 printf("This is a pthread.\n");
  11.                 sleep(1);
  12.         }
  13. }
  14. void thread2(void)
  15. {
  16.         int i;
  17.         for(i=0;i<30;i++)
  18.         {
  19.                 printf("This is a -------- pthread.\n");
  20.                 sleep(1);
  21.         }
  22. }
  23. int main(void)
  24. {
  25.         pthread_t id;
  26.         pthread_t id2;
  27.         int i,ret,ret2;
  28.         ret=pthread_create(&id,NULL,(void *) thread,NULL);
  29.         ret2=pthread_create(&id2,NULL,(void *) thread2,NULL);
  30.         if(ret!=0 || ret2 !=0){
  31.                 printf ("Create pthread error!\n");
  32.                 exit (1);
  33.         }
  34.         for(i=0;i<30;i++)
  35.         {
  36.                 printf("This is the main process.\n");
  37.                 sleep(1);
  38.         }
  39.         pthread_join(id,NULL);
  40.         pthread_join(id2,NULL);
  41.         return (0);
  42. }
复制代码

这个应该可以,需要用  sleep(1),
回复 支持 反对

使用道具 举报

发表于 2006-7-30 17:21:20 | 显示全部楼层
如果不加 sleep(1) 的话,把循环次数 改大一些,如300000,
再输出到文件,查看,可以看到有变化输出。

总感觉 LINUX 的线程还是比 WIN 的线程 “大” 。
回复 支持 反对

使用道具 举报

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

本版积分规则

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