《》
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static int max=10000000; static long _count = 0; static void Main(string[] args) { //Console.WriteLine("主线程运行"); Thread t1 = new Thread(new ThreadStart(() => { for (int i = 0; i < max; i++) { _count--; } })); t1.Start(); Console.WriteLine("t1线程已经启动,开始对_count变量++"); Console.WriteLine("主线程继续执行......."); for (int i = 0; i < max; i++) { _count++; } t1.Join(); Console.WriteLine("_count的值是" + _count); Console.ReadKey(); } } }
程序的执行结果,并没有我们想象中的_count=0
原因如下:
其实_count++ 的意思是:
总共分为三步: 第一步:把_count变量中的值取出来 第二步:将取出来的值加1 第三部:将加1后的值在赋值给_count
现在是主线程执行_count++的任务,而子线程t1执行的是_count-- 的任务
因为我们不只是CPU什么时候调度主线程,什么时候调度子线程,那我们可以做个假设。假如cpu最先调度主线程把0从_count中取出,然后++变成了1 然后又把1赋值给_count ,而当主线程执行了这三步了,而子线程t1一次都没被调用,单主线程执行第四部在把把1从_count中取出,t1这个子线程还是没有被CPU调度执行。
在第五步的时候,此时cpu调度了子线程t1,而没有调度主线程,此时t1这个线程里执行的是 从_count中把1取出 ,而就在t1从_count中把1取出后,CPU又去调度主线程去了
所以第六步 ,主线程执行的是 把取出的1加加结果是2,然后第七步CPU又没有调度子线程,而是调度的是主线程,此时主线程执行的是:把2赋值给_count
当第八步的时候,CPU终于调度子线程t1了。因为在第五步的时候t1已经从_count中把1取出 所以 第八步的时候子线程执行--操作,把取出的1递减结果是0 而第九步CPU有是调度t1这个子线程 ,子线程t1执行的是 把0赋值给_ount
以上结论是 假如主线程和子线程里的循环都循环1千万次,当主线程调用了6次的时候将_count从0自增到了2 而子线程仅仅执行了3次就将“2”--到0,其实这样说不对,应该说
将2直接赋值为0了
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-12 04:49:38