比如这样一个程序
main()
{
X()//函数
}
执行过程是main执行到X函数,则主程序把控制权交给X()函数,执行X()函数,当X()函数执行完之后再把控制权交给主程序。主程序继续执行。
而如果是
main()
{
AfxBeginThread(X())//线程
}
执行过程是main执行到X()线程,主程序并不把控制权交给X()线程,只有当主程序执行完之后才把控制权交给线程。线程开始执行。
——————————
有种说法是,函数与主程序可以看作是串行关系,而线程和主程序可以看作是并行关系。照上面这样一个程序来说,线程与进程也是一种串行关系啊?怎么能说是并行关系呢?谢谢
main()
{
X()//函数
}
执行过程是main执行到X函数,则主程序把控制权交给X()函数,执行X()函数,当X()函数执行完之后再把控制权交给主程序。主程序继续执行。
而如果是
main()
{
AfxBeginThread(X())//线程
}
执行过程是main执行到X()线程,主程序并不把控制权交给X()线程,只有当主程序执行完之后才把控制权交给线程。线程开始执行。
——————————
有种说法是,函数与主程序可以看作是串行关系,而线程和主程序可以看作是并行关系。照上面这样一个程序来说,线程与进程也是一种串行关系啊?怎么能说是并行关系呢?谢谢
但是,进程是线程的容器,进程自身是不做任何事情的,其实,干事情的只有主线程和从线程,每个进程一定有一个主线程,但是不一定有从线程.
-----------------------------------------------------------------------------------------
并不一定是主程序执行完之后,控制权才移交,在主程序执行过程中控制权是有可能交互切换的,这由操作系统算法决定,比如每个线程指定只能运行1ms,时间到了就强制切换到其它线程。
当有多核时,才有可能真正的并行,理论上讲要比单核要快.可以多线程同时运算.这也是楼主所说的程序,如果是你说的下面那种,当执行到afx...(x)时,产生一个线程.主线程同时继续.在多核时,可能会分在两个CPU上运行.但单核上没办法,多出的那个线程在主线程正在运行时,可能只有等...当主线程空闲时(注意:不是执行完)这个x线程忙里偷闲几个时间片.
线程是代码的执行路径
main函数,是进程这个容器中创建的第一个线程,所以它是主线程。X() 这个函数对于CPU而言根本没觉察到它是一个函数。
唯一的不同就是, 进入到函数的时候, 有一堆的汇编指令在那里保存当前的寄存器、堆栈和上下文。
这些asm,都是编译的时候生成的。CPU看到的就只有指令,它不会管执行到哪个类哪个方法了 。 对它来说都是线性的。
lz理解错了。main()函数本身就是在你所说的主线程中。新的线程跟主线程是并发执行的,分享cpu的时间片。而不是主程序执行完之后才把控制权交给线程。
如果新起一个子线程的话,
操作系统是会按照一定的调度算法在某个时间将主线程调出处理器而把子线程调度进处理器。
而并不是LZ所认为的要在main执行结束再执行新起的子线程
是不是先不要考虑真并行还是假并行的问题.....这些细节我觉得不是现在需要考虑的.现在只需要了解一下流程即可...main()
{
X()//函数
} 以上即是你自己拿着把夹子去夹老鼠.....由于你只一个人,一次只能同时做一件事.....最多同时夹到一只老鼠......main()
{
AfxBeginThread(X())//线程
} 以上即是,你找来另一人帮忙也拿个夹子去夹......他夹你也夹(他好我也好?!).......那么那个人在夹老鼠的时候,你当然还是可以做其他事的...你可以看着他夹完再做你的事(老板?)你也可以让他闪人(结束线程....?)呃.....以上个人理解而已.啃饼.喝二锅.匿.
进程:一个程序运行的实例。
线程: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("辅线程执行完毕!");
}
}
}
创建了一个单独的线程,他和main()是并行的
public static void main(String[] args) {
try {
Thread.sleep(300000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
......
}主程序在子线程休眠5分钟后才开始运行子线程后面的程序