比如这样一个程序
main()
{
   X()//函数
}
执行过程是main执行到X函数,则主程序把控制权交给X()函数,执行X()函数,当X()函数执行完之后再把控制权交给主程序。主程序继续执行。
而如果是
main()
{
   AfxBeginThread(X())//线程
}
执行过程是main执行到X()线程,主程序并不把控制权交给X()线程,只有当主程序执行完之后才把控制权交给线程。线程开始执行。
——————————
有种说法是,函数与主程序可以看作是串行关系,而线程和主程序可以看作是并行关系。照上面这样一个程序来说,线程与进程也是一种串行关系啊?怎么能说是并行关系呢?谢谢

解决方案 »

  1.   

    主函数(main)与其他的函数可以看作是串行关系,你可以从汇编的代码中看出来.
    但是,进程是线程的容器,进程自身是不做任何事情的,其实,干事情的只有主线程和从线程,每个进程一定有一个主线程,但是不一定有从线程.
      

  2.   

    那是不是说main本身有一个主线程,X() 线程只是一个从线程?
      

  3.   

    执行过程是main执行到X()线程,主程序并不把控制权交给X()线程,只有当主程序执行完之后才把控制权交给线程。线程开始执行。
    -----------------------------------------------------------------------------------------
    并不一定是主程序执行完之后,控制权才移交,在主程序执行过程中控制权是有可能交互切换的,这由操作系统算法决定,比如每个线程指定只能运行1ms,时间到了就强制切换到其它线程。
      

  4.   

       单核上怎么可能有真正的并行?但可以有线程,这是我们叫并发.就是从一段时间看,程序好像在"同时"执行,其实只是交替占用CPU时间.但由于CPU速度太快,你无法感觉到.
       当有多核时,才有可能真正的并行,理论上讲要比单核要快.可以多线程同时运算.这也是楼主所说的程序,如果是你说的下面那种,当执行到afx...(x)时,产生一个线程.主线程同时继续.在多核时,可能会分在两个CPU上运行.但单核上没办法,多出的那个线程在主线程正在运行时,可能只有等...当主线程空闲时(注意:不是执行完)这个x线程忙里偷闲几个时间片.
      

  5.   

    进程是线程的容器。
    线程是代码的执行路径
    main函数,是进程这个容器中创建的第一个线程,所以它是主线程。X() 这个函数对于CPU而言根本没觉察到它是一个函数。
    唯一的不同就是, 进入到函数的时候, 有一堆的汇编指令在那里保存当前的寄存器、堆栈和上下文。
    这些asm,都是编译的时候生成的。CPU看到的就只有指令,它不会管执行到哪个类哪个方法了 。 对它来说都是线性的。
      

  6.   


    lz理解错了。main()函数本身就是在你所说的主线程中。新的线程跟主线程是并发执行的,分享cpu的时间片。而不是主程序执行完之后才把控制权交给线程。
      

  7.   

    各位大虾,弱弱的问个问题哈,多核CPU的多线程程序中,主线程是仍只有一个还是多个?要是一个是在哪个核上呢?要是多个,他们是如何开始线程的呢?
      

  8.   

    主线程是针对进程而言的,进入main或WinMain的线程,只能有一个。与是否多核没有关系。既然在哪个核上运行,应该可以有相关的SDK设定吧
      

  9.   

    cpu有一个时间片,执行到一个线程CPU就会为该线程分配一个时间片,该线程的时间片到了会自动去执行另外一个线程,这个时间片一般很小,感觉不到,在单核上不可能做到并行,但是可以做到并法(一段时间内在同时运行)lz这说法"只有当主程序执行完之后才把控制权交给线程。线程开始执行。 "所以就不对了.
      

  10.   

    main()函数所在的线程应该是这个进程里的主线程。
    如果新起一个子线程的话,
    操作系统是会按照一定的调度算法在某个时间将主线程调出处理器而把子线程调度进处理器。
    而并不是LZ所认为的要在main执行结束再执行新起的子线程
      

  11.   

    main结束,进程就结束了,所有线程也就结束了
      

  12.   

    在我看如果从底层点讲起就是通过时钟中断的中断程序判断该哪个线程执行了和进行相关的时间片以及线程等待(sleep)时间的算法,下一个时钟中断来临时又是一个线程选择和相关算法实现,当然具体的压栈以及取进程环境信息等操作都是在内核的时钟中断或者其转向的子程序中实现,这是一个比较复杂的过程
      

  13.   


    是不是先不要考虑真并行还是假并行的问题.....这些细节我觉得不是现在需要考虑的.现在只需要了解一下流程即可...main() 

      X()//函数 
    } 以上即是你自己拿着把夹子去夹老鼠.....由于你只一个人,一次只能同时做一件事.....最多同时夹到一只老鼠......main() 

      AfxBeginThread(X())//线程 
    } 以上即是,你找来另一人帮忙也拿个夹子去夹......他夹你也夹(他好我也好?!).......那么那个人在夹老鼠的时候,你当然还是可以做其他事的...你可以看着他夹完再做你的事(老板?)你也可以让他闪人(结束线程....?)呃.....以上个人理解而已.啃饼.喝二锅.匿.
      

  14.   

    我来回答下:
        进程:一个程序运行的实例。
        线程:CPU运行指令。
        进程与线程的关系:1:n(n>=1)
        
        1、程序运行开始后.NET 首先要找入口函数Main().它本身就会开启一个线程。所以可以向你所说的是串行。但用串行来表达我不知道是否科学。
        2、第二个因为你已经开启了另一个线程。所以现在这个进程里有2个线程。但是具体是哪个线程先运行完或怎样运行就另说。你当然可以用线程的优先级来设置线程的运行顺序。但原理都是CPU分配时间片的问题。有可能是Main函数的方法先运行完,也有可能是另一个线程的方法先运行完。也许你测试的结果刚好是Main函数先运行完的结果,这只能说是这个线程在CPU分配的时间内完成了所需要的操作。若没完成当然要挂起,要分配给第二个线程运行。
        刚好手里有个小例子,玩一下试试吧。如下:
    using System;
    using System.Threading;namespace ConsoleApplication1
    {
        class Program
        {
            static double interval;        static void Main(string[] args)
            {
                Console.Write("interval to display results Attribute?>");
                interval = double.Parse(Console.ReadLine());
                Thread thisThead = Thread.CurrentThread;
                thisThead.Name = "主线程";            ThreadStart workStart = new ThreadStart(StartMethod);
                Thread workThread = new Thread(workStart);
                workThread.Name = "辅线程";
                workThread.Start();            DisplayNumbers();
                Console.WriteLine("主线程执行完毕!");
            }        private static void SetNumber(int i)
            {
                int result = i;
                Console.WriteLine(result);
            }        static void StartMethod2()
            {
                SetNumber(2);
            }        private static void DisplayNumbers()
            {
                Thread thisTread = Thread.CurrentThread;
                string name = thisTread.Name;
                Console.WriteLine("线程名:" + name);
                Console.WriteLine(name + ":文化为:" + thisTread.CurrentCulture);            for (int i = 1; i <= 8 * interval; i++)
                {
                    if (i % interval == 0)
                    {
                        Console.WriteLine(name + ":count has reached  " + i);
                    }
                }
            }        static void StartMethod()
            {
                DisplayNumbers();
                Console.WriteLine("辅线程执行完毕!");
            }
        }
    }
      

  15.   

    进程只是资源和数据的集合,代码的执行是在线程中进行的。默认情况下会有一个主线程之行main中的代码,如果我们在main中创建子线程之行其他操作的话,主线程和子线程是并行之行的,不知道这样说对不对...
      

  16.   

    除非是多核的,不然windows就是串行的,只是看起来像并行,主线程只有在空闲的时候才会把时间片给子线程
      

  17.   

    单核是分时处理,一个线成活的一个时间偏,main()中的x函数属于main()线呈,而main()种创建线程的的函数
    创建了一个单独的线程,他和main()是并行的
      

  18.   


    public static void main(String[] args) {
       try {
    Thread.sleep(300000);
    } catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    ......
    }主程序在子线程休眠5分钟后才开始运行子线程后面的程序