一、并发与并行
并行:两个线程在同一时刻同时执行,需要有两个处理器。
并发:两个线程在同一时刻交替执行,只有一个处理器。
并行是一种特殊的并发。
二、线程并发运行
代码如下:
代码分析:
主函数中第一个for循环,pthread_create了5次,这5次i的值一次被改为0,1,2,3,4,但是在这个变化的过程中,被创建的5个线程都没有去获取i的值,因为这5个线程都还没有执行到获取i的值的那一行代码,等主函数中执行到第28行的时候,它们才会执行获取i的值的那一行代码。也就是说被创建的新线程在for循环结束后才会去获取i的值,并不是在for循环进行的时候去获取i的值。
运行结果:
可以看出,使用多线程,程序运行的结果具有不确定性。
以下结果就是多线程并发运行出现的现象:
结果分析:
两次输出的结果值一样顺序不一样的原因:
这是因为被创建的线程函数中index获取了i的值并第一次输出了i的值,睡眠了1秒,这个时候第二次输出的i的值就是在第一次输出i的值之前index已经获取到的值,所以第二次输出的i的值和第一次输出的i的值是一样的,只是第二次输出i的值的顺序和第一次输出i的值的顺序不一样。顺序不一样是因为多线程运行的时候是并发运行,多个线程同时执行,执行顺序不确定。
输出两个3但是没有输出2的原因:
这是因为在代码中主线程中i的值在不断变化,被创建的线程函数在获取i的值的时候获取的是那一刻i的值,主线程中的从pthread_create地方开始才会有多条执行路径,pthread_create连续执行5次就是连续给系统提交要创建5个线程,系统要依次去启动这5个线程,几乎在同一时间这5个线程被陆陆续续启动,启动之后这5个线程都陆陆续续去获取i的值,这5个线程在获取i的值得时候那一刻i的值是多少就获取到多少。其中有两个线程在获取i的值的时候一起获取i的值,这时候它们获取到的i的值都为3,也就是说,有两个线程在同一刻去获取i的值,这一刻i的值为3,这两个线程同时执行输出值为3。
当前Linux系统中有4个处理器:
所以两个线程有可能发生并行,就像上边两个线程在同一时刻去获取i的值,这一刻i的值为3,这两个线程同时执行输出值为3。就属于是并行运行。