[原创]vb.net 应用多线程时的注意事项(2)

问题描述

如下程序同步运行后返回不正确,应该返回300万,实际返回了400万。ImportsSystem.Collections.ConcurrentPublicClassClass1PrivateConCurrentBag1AsNewConcurrentBag(OfInteger)'在这里创建ConcurrentBag,运行结果发生错误。SubMySub()DimTask1AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)DimTask2AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task1.RunSynchronously()Task2.RunSynchronously()DimList1AsNewList(OfInteger)List1.AddRange(Task1.Result)List1.AddRange(Task2.Result)MsgBox(List1.Count)EndSubFunctionMyFunc()AsConcurrentBag(OfInteger)'DimConCurrentBag1AsNewConcurrentBag(OfInteger)Forindex1AsInteger=1To1000000ConCurrentBag1.Add(index1)NextReturnConCurrentBag1EndFunctionEndClass

解决方案

解决方案二:
还是之前的问题,只不过换了个方法你先搞清楚Task1.RunSynchronously()到底是阻塞谁
解决方案三:
这特么不返回400万才有鬼了。你举例子的时候,能举个真正靠谱的例子么?
解决方案四:
话说,300万到底怎么计算出来的,你能先说说你对这段代码的理解吗
解决方案五:
引用3楼Z65443344的回复:

话说,300万到底怎么计算出来的,你能先说说你对这段代码的理解吗

我看你们这个样子如何写多线程,特别是数据安全的多线程。你们这个样子本应该完整的数据会不会变成软七八道吗?所以,你们两个好好学习啊
解决方案六:
如下代码每次单击运行都返回了400万,应该返回不确定的可变的数量。上面的代码程序和本下面的代码程序源于发生同一个错误的。这样说大家可能弄明白了.ImportsSystem.Collections.ConcurrentPublicClassClass1PrivateConCurrentBag1AsNewConcurrentBag(OfInteger)'在这里创建ConcurrentBag,运行结果发生错误。SubMySub()DimTask1AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)DimTask2AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task1.Start()Task2.Start()Task1.Wait()Task2.Wait()DimList1AsNewList(OfInteger)List1.AddRange(Task1.Result)List1.AddRange(Task2.Result)MsgBox(List1.Count)EndSubFunctionMyFunc()AsConcurrentBag(OfInteger)'DimConCurrentBag1AsNewConcurrentBag(OfInteger)Forindex1AsInteger=1To1000000ConCurrentBag1.Add(index1)NextReturnConCurrentBag1EndFunctionEndClass

解决方案七:
继续等分你们慢慢争论吧,得出结论了再叫我
解决方案八:
莫名其妙首先你解释下什么叫“错误”你这么写只能认为你要的就是这个效果,没有任何错误还有,什么叫做“应该返回300万,实际返回了400万。”这是“应该返回400万,实际返回了400万。”两个Task顺序执行完毕,ConcurrentBag有200w元素,然后两个Task.Result都取到这个ConcurrentBag对象,加起来400W。有什么不对的?你想要300W就在MyFunc里返回ConCurrentBag1的副本
解决方案九:
引用4楼office_2007的回复:

Quote: 引用3楼Z65443344的回复:
话说,300万到底怎么计算出来的,你能先说说你对这段代码的理解吗

我看你们这个样子如何写多线程,特别是数据安全的多线程。你们这个样子本应该完整的数据会不会变成软七八道吗?所以,你们两个好好学习啊

既然事实就是每次必然返回400万,你就必须承认自己理解有误,而不是怪编译器错了
解决方案十:
或者说,微软做错了,我们也都是错的你看到的显示是错的只有你的思想最正确,这样总行了吧
解决方案十一:
引用9楼Z65443344的回复:

或者说,微软做错了,我们也都是错的你看到的显示是错的只有你的思想最正确,这样总行了吧

我不是提问,你应该找上面第一个程序中的错误,你解释不了那当然是废话不是吗?
解决方案十二:
引用7楼hhddzz的回复:

莫名其妙首先你解释下什么叫“错误”你这么写只能认为你要的就是这个效果,没有任何错误还有,什么叫做“应该返回300万,实际返回了400万。”这是“应该返回400万,实际返回了400万。”两个Task顺序执行完毕,ConcurrentBag有200w元素,然后两个Task.Result都取到这个ConcurrentBag对象,加起来400W。有什么不对的?你想要300W就在MyFunc里返回ConCurrentBag1的副本

这么说你的答案完全是错误了。你根本不知道线程任务中的RunSynchronously()方法。不是你一个人不知道,这个帖子回复的另外两个人都不知道,所以,他们和你都不服气了。线程任务中的RunSynchronously()方法的运行机制是这样的。按顺序触发第一线程的RunSynchronously()方法时,第二线程完全不会工作。这完全是主线程中的阻塞模式完全一样。这种执行模式叫做同步。我说到这里你应该明白这种同步机制下应该返回多少吗300万还是400万正确?再次看看上面你说的《还有,什么叫做“应该返回300万,实际返回了400万。”这是“应该返回400万,实际返回了400万。》真的应该返回400万吗?你这样的认识多线程,写多线程的本应该完整的数据会不会变成乱七八道吗?这样哪个厂商信任你啊!
解决方案十三:
引用11楼office_2007的回复:

Quote: 引用7楼hhddzz的回复:
莫名其妙首先你解释下什么叫“错误”你这么写只能认为你要的就是这个效果,没有任何错误还有,什么叫做“应该返回300万,实际返回了400万。”这是“应该返回400万,实际返回了400万。”两个Task顺序执行完毕,ConcurrentBag有200w元素,然后两个Task.Result都取到这个ConcurrentBag对象,加起来400W。有什么不对的?你想要300W就在MyFunc里返回ConCurrentBag1的副本

线程任务中的RunSynchronously()方法的运行机制是这样的。按顺序触发第一线程的RunSynchronously()方法时,第二线程完全不会工作。这完全是主线程中的阻塞模式完全一样。这种执行模式叫做同步。

RunSynchronously()怎么执行的不用你教,你看不懂“两个Task顺序执行完毕”这几个字?
解决方案十四:
别争了。。。
解决方案十五:
引用12楼hhddzz的回复:

Quote: 引用11楼office_2007的回复:
Quote: 引用7楼hhddzz的回复:
莫名其妙首先你解释下什么叫“错误”你这么写只能认为你要的就是这个效果,没有任何错误还有,什么叫做“应该返回300万,实际返回了400万。”这是“应该返回400万,实际返回了400万。”两个Task顺序执行完毕,ConcurrentBag有200w元素,然后两个Task.Result都取到这个ConcurrentBag对象,加起来400W。有什么不对的?你想要300W就在MyFunc里返回ConCurrentBag1的副本

线程任务中的RunSynchronously()方法的运行机制是这样的。按顺序触发第一线程的RunSynchronously()方法时,第二线程完全不会工作。这完全是主线程中的阻塞模式完全一样。这种执行模式叫做同步。

RunSynchronously()怎么执行的不用你教,你看不懂“两个Task顺序执行完毕”这几个字?

你完全喝醉了。。。一年级小学生一样我们一起用手指数一数吧。第一线程完成任务时100万?还是200万?你可能选200万。这是因为,你错误认为当第一线程工作时,错误认为第二线程也工作了。第一线程任务完成时100万,只有第二线程任务完成时才200万元素啊!所以,一共有300万啊。再看看上面你说的<两个Task顺序执行完毕,ConcurrentBag有200w元素,然后两个Task.Result都取到这个ConcurrentBag对象,加起来400W。有什么不对的?>因为,你不知道线程任务中的RunSynchronousl方法。只有异步运行时Task1.StartTask2.Start只有这两句Start方法时两个线程同时都工作,
解决方案:
我也有一个犯过错误的地方。两个线程异步操作时,两个线程之间不存在阻塞模式,只会先完成的任务先返回过去了,不会有阻塞。两个线程异步操作时不会共享同一个函数,请注意的是两个线程会各复制同一个函数独立运行。只有同步操作时不存在复制行为。
解决方案:
LZ这次不玩并发了,也不ToList了,同步执行,还直接返回ConCurrentBag1。离多线程的应用场景相去甚远,该换个标题了。复制函数这说法又是误导,函数/方法不会被复制的,是线程有独立的栈而已。
解决方案:
RunSynchronously()怎么执行的不用你教+1这跟把所有执行过程都放在一个线程里执行有什么区别呢第一个执行完,里面有100万第二个执行完,里面有200万然后把200万加入数组然后再把200万加入数组你猜猜现在是几百万
解决方案:
而且DimTask1AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task1.RunSynchronously()DimTask2AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task2.RunSynchronously()这才是先执行1,再执行2吧你只是将主线程与子线程同步两个子线程之间是没有同步的,还是并发执行
解决方案:
话说,你只会看里面的数量,不敢看看里面的数据到底是什么顺序吗
解决方案:
引用16楼github_22161131的回复:

LZ这次不玩并发了,也不ToList了,同步执行,还直接返回ConCurrentBag1。离多线程的应用场景相去甚远,该换个标题了。复制函数这说法又是误导,函数/方法不会被复制的,是线程有独立的栈而已。

我回复中的第二个程序代码不是并发吗?还有说法很不对。就像两个司机开一个车,一个司机要左边方向走,另一个司机却要右边方向走。这样能开车吗?按照你的说法多线程并发运行同一个函数如何操作,能独立运行吗?第一线程For循环至n点时,其他线程的For循环如何走?会不会跟着走?两个线程如何把同一个For循环各自走吗?看来你也根本不懂运行机制啊。
解决方案:
所谓代码,那是在CPU里执行的,不是在内存里执行的完全没有任何必要将一段相同的代码放入两个不同的内存空间仅仅是不同线程执行时使用的变量内存不一样而已,代码都是同一段
解决方案:
所谓代码,就好比公式完全没必要谁要使用公式都去复印一份只要有一份,贴在墙上,大家谁用谁去看就可以了那不同的人使用同一个公式进行不同的计算,为什么计算结果不会互相冲突呢因为变量是不共享的,各自用各自的
解决方案:
而你在主楼贴的代码就好比2个人用同一组公式进行同样的计算谁计算出一个数来,就把它填写在表格里两个人使用同一个表格然后还有个老师监督他们,老师先给他们俩分配任务,分配完就站等着直到两个人都填写好了,然后老师把这个表格拿去复印了一份,复印完又复印一份
解决方案:
引用18楼Z65443344的回复:

而且DimTask1AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task1.RunSynchronously()DimTask2AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task2.RunSynchronously()这才是先执行1,再执行2吧你只是将主线程与子线程同步两个子线程之间是没有同步的,还是并发执行

你怎么越来越愚蠢啊!我说过你根本不懂RunSynchronously方法运行机制啊。按照你的说法两个线程并发的状态的话,第一线程完成后返回时多少?100万?按照你的说法走返回结果两个线程一共加起来不确定的数字,肯定的是多次单击会返回不同的数量。到时候我给你答案。这个帖子的回复中你会看到答案。到时候好好学习啊。`
解决方案:
引用19楼Z65443344的回复:

话说,你只会看里面的数量,不敢看看里面的数据到底是什么顺序吗

哈哈!·ConCurrntBag对象是无序集合。交叉加入数据时它按哈希码值进行排列,数字上倒着挂起来了!。这是与HashTable模式一样数字排列倒着挂起来了。9876543210
解决方案:
引用20楼office_2007的回复:

Quote: 引用16楼github_22161131的回复:
LZ这次不玩并发了,也不ToList了,同步执行,还直接返回ConCurrentBag1。离多线程的应用场景相去甚远,该换个标题了。复制函数这说法又是误导,函数/方法不会被复制的,是线程有独立的栈而已。

我回复中的第二个程序代码不是并发吗?还有说法很不对。就像两个司机开一个车,一个司机要左边方向走,另一个司机却要右边方向走。这样能开车吗?按照你的说法多线程并发运行同一个函数如何操作,能独立运行吗?第一线程For循环至n点时,其他线程的For循环如何走?会不会跟着走?两个线程如何把同一个For循环各自走吗?看来你也根本不懂运行机制啊。

呵呵。LZ以为并发的时候方法会被复制,那方法里面调用的其它方法会不会被复制啊,整个调用链都要被复制么?递归调用的时候方法会被复制很多遍么?
解决方案:
看不懂,听说有分
解决方案:
引用26楼github_22161131的回复:

Quote: 引用20楼office_2007的回复:
Quote: 引用16楼github_22161131的回复:
LZ这次不玩并发了,也不ToList了,同步执行,还直接返回ConCurrentBag1。离多线程的应用场景相去甚远,该换个标题了。复制函数这说法又是误导,函数/方法不会被复制的,是线程有独立的栈而已。

我回复中的第二个程序代码不是并发吗?还有说法很不对。就像两个司机开一个车,一个司机要左边方向走,另一个司机却要右边方向走。这样能开车吗?按照你的说法多线程并发运行同一个函数如何操作,能独立运行吗?第一线程For循环至n点时,其他线程的For循环如何走?会不会跟着走?两个线程如何把同一个For循环各自走吗?看来你也根本不懂运行机制啊。

呵呵。LZ以为并发的时候方法会被复制,那方法里面调用的其它方法会不会被复制啊,整个调用链都要被复制么?递归调用的时候方法会被复制很多遍么?

你要递归调用和多线程相提并论吗?递归是只有一个线程调用,没有第二者,所以,不冲突。递归是有个特点,n次调用就n次阻塞,然后,n次一级一级地返回。
解决方案:
引用28楼office_2007的回复:

Quote: 引用26楼github_22161131的回复:
Quote: 引用20楼office_2007的回复:
Quote: 引用16楼github_22161131的回复:
LZ这次不玩并发了,也不ToList了,同步执行,还直接返回ConCurrentBag1。离多线程的应用场景相去甚远,该换个标题了。复制函数这说法又是误导,函数/方法不会被复制的,是线程有独立的栈而已。

我回复中的第二个程序代码不是并发吗?还有说法很不对。就像两个司机开一个车,一个司机要左边方向走,另一个司机却要右边方向走。这样能开车吗?按照你的说法多线程并发运行同一个函数如何操作,能独立运行吗?第一线程For循环至n点时,其他线程的For循环如何走?会不会跟着走?两个线程如何把同一个For循环各自走吗?看来你也根本不懂运行机制啊。

呵呵。LZ以为并发的时候方法会被复制,那方法里面调用的其它方法会不会被复制啊,整个调用链都要被复制么?递归调用的时候方法会被复制很多遍么?

你要递归调用和多线程相提并论吗?递归是只有一个线程调用,没有第二者,所以,不冲突。递归是有个特点,n次调用就n次阻塞,然后,n次一级一级地返回。

故意逃避了第一个问题么?没关系,你不清楚我继续问,递归的时候为什么不用复制就可以实现一级里面的变量不会影响另一级的呢?
解决方案:
你肯定是理解不了“你为什么要共享地操作ConCurrentBag1变量?”这个问题,然后用一大堆你自己觉得花哨的名词儿、加上谩骂来回应别人对你的善意回复。我觉得你还是问你的同学和老师吧,他们可能比较了解你的性格,可以有耐心告诉你点编程知识。
解决方案:
引用29楼github_22161131的回复:

故意逃避了第一个问题么?没关系,你不清楚我继续问,递归的时候为什么不用复制就可以实现一级里面的变量不会影响另一级的呢?

其实就跟用公式计算一样一样的如果需要用同一个公式反复计算多次比如一个数乘以10%,再乘以10%,连续乘600次并不是每次把10%复制一份放到一个地方,而仅仅是保存中间结果就可以了
解决方案:
引用

第一线程完成任务时100万?还是200万?你可能选200万。这是因为,你错误认为当第一线程工作时,错误认为第二线程也工作了。第一线程任务完成时100万,只有第二线程任务完成时才200万元素啊!所以,一共有300万啊。

其实我有点明白了为什么LZ知道代码的运行顺序还会有结果是300W这么2的说法呢,有下面几种可能:1.装疯2.真疯3.人家只是不理解变量、对象、值类型、引用类型、参数的传递与函数的返回等基本概念而已人家只是不理解ReturnConCurrentBag1,不知道Task1.Result和Task2.Result引用的是同一个对象人家只是以为下面的代码会输出7而已Dimlist1AsNewList(OfInteger)({1,2,3})Dimlist2=list1list2.Add(4)Console.WriteLine(list1.Count+list2.Count)

解决方案:
引用14楼office_2007的回复:

你完全喝醉了。。。一年级小学生一样我们一起用手指数一数吧。第一线程完成任务时100万?还是200万?你可能选200万。这是因为,你错误认为当第一线程工作时,错误认为第二线程也工作了。第一线程任务完成时100万,只有第二线程任务完成时才200万元素啊!所以,一共有300万啊。再看看上面你说的<两个Task顺序执行完毕,ConcurrentBag有200w元素,然后两个Task.Result都取到这个ConcurrentBag对象,加起来400W。有什么不对的?>因为,你不知道线程任务中的RunSynchronousl方法。只有异步运行时Task1.StartTask2.Start只有这两句Start方法时两个线程同时都工作,

你在帖子中反复堆砌了这么多“名词儿”,了怎么连个“断点调试”都不会?你在DimList1AsNewList(OfInteger)这行设置一个断点看看,此时ConCurrentBag1变量中是你说的300万吗?
解决方案:
如果ConCurrentBag1中有300万,那么最终得到的List1中就应该有600万。如果ConCurrentBag1中有200万,那么最终List1中就是400万。如果ConCurrentBag1只有100万,那么最终List1中就应该有200万。这本来是可以分析、说明的。但是“我是学生明星,我就算是求助,也是在居高临下考察你们”的态度让人难以跟lz深入分析。
解决方案:
引用33楼sp1234的回复:

Quote: 引用14楼office_2007的回复:
你完全喝醉了。。。一年级小学生一样我们一起用手指数一数吧。第一线程完成任务时100万?还是200万?你可能选200万。这是因为,你错误认为当第一线程工作时,错误认为第二线程也工作了。第一线程任务完成时100万,只有第二线程任务完成时才200万元素啊!所以,一共有300万啊。再看看上面你说的<两个Task顺序执行完毕,ConcurrentBag有200w元素,然后两个Task.Result都取到这个ConcurrentBag对象,加起来400W。有什么不对的?>因为,你不知道线程任务中的RunSynchronousl方法。只有异步运行时Task1.StartTask2.Start只有这两句Start方法时两个线程同时都工作,

你在帖子中反复堆砌了这么多“名词儿”,了怎么连个“断点调试”都不会?你在DimList1AsNewList(OfInteger)这行设置一个断点看看,此时ConCurrentBag1变量中是你说的300万吗?

人家会说,这就是bug啊,Task1.Result明明该是100W,怎么会是200W,这不科学,有阴毛
解决方案:
引用32楼hhddzz的回复:

引用
第一线程完成任务时100万?还是200万?你可能选200万。这是因为,你错误认为当第一线程工作时,错误认为第二线程也工作了。第一线程任务完成时100万,只有第二线程任务完成时才200万元素啊!所以,一共有300万啊。

其实我有点明白了为什么LZ知道代码的运行顺序还会有结果是300W这么2的说法呢,有下面几种可能:1.装疯2.真疯3.人家只是不理解变量、对象、值类型、引用类型、参数的传递与函数的返回等基本概念而已人家只是不理解ReturnConCurrentBag1,不知道Task1.Result和Task2.Result引用的是同一个对象人家只是以为下面的代码会输出7而已Dimlist1AsNewList(OfInteger)({1,2,3})Dimlist2=list1list2.Add(4)Console.WriteLine(list1.Count+list2.Count)

确认楼主是真疯如果他有某件事不明白,也应该是询问而不是考考你,编译器在这里为什么会编译错误?
解决方案:
然后还声称自己会放出正确答案我就坐等正确答案
解决方案:
引用37楼Z65443344的回复:

然后还声称自己会放出正确答案我就坐等正确答案

他这个“正确”“错误”什么的本来就是让人醉得不行顶楼的代码运行结果是400W这是客观事实,他觉得错了,难道他有本是让MS改成300W不成
解决方案:
如果单步调试,可以看到Task1.Result返回的是200万。然后看到上一步确实已经把返回对象给“意外地”追加到200数据了(而不是100万)。其实帖子的标题“[原创]vb.net应用多线程时的注意事项”,这种标题反映了求助者的心态。什么样的提问方式,决定了什么样的回答。
解决方案:
引用38楼hhddzz的回复:

Quote: 引用37楼Z65443344的回复:
然后还声称自己会放出正确答案我就坐等正确答案

他这个“正确”“错误”什么的本来就是让人醉得不行顶楼的代码运行结果是400W这是客观事实,他觉得错了,难道他有本是让MS改成300W不成

我觉得他没本事把400万变成300万,但是他有本事解释微软到底哪里做错了,导致出现的BUG
解决方案:
"应用多线程时的注意事项"就是告诉大家:微软这里有这样一个BUG用的时候要注意呀
解决方案:
引用33楼sp1234的回复:

Quote: 引用14楼office_2007的回复:
你完全喝醉了。。。一年级小学生一样我们一起用手指数一数吧。第一线程完成任务时100万?还是200万?你可能选200万。这是因为,你错误认为当第一线程工作时,错误认为第二线程也工作了。第一线程任务完成时100万,只有第二线程任务完成时才200万元素啊!所以,一共有300万啊。再看看上面你说的<两个Task顺序执行完毕,ConcurrentBag有200w元素,然后两个Task.Result都取到这个ConcurrentBag对象,加起来400W。有什么不对的?>因为,你不知道线程任务中的RunSynchronousl方法。只有异步运行时Task1.StartTask2.Start只有这两句Start方法时两个线程同时都工作,

你在帖子中反复堆砌了这么多“名词儿”,了怎么连个“断点调试”都不会?你在DimList1AsNewList(OfInteger)这行设置一个断点看看,此时ConCurrentBag1变量中是你说的300万吗?

哈哈!!!你也是跟他们一样愚蠢啊`你这样能做专家吗?你这样落后的知识肯定不行。因为,你对多线程的运行机制还是不够理解。还有你最好请注意,我不是恶意谩骂。我这样说了也算谩骂?,之前你已经对我说的话已经早已是谩骂很多次我了。但是我还是把你的话当作善意了。只是难听下去。
解决方案:
引用15楼office_2007的回复:

我也有一个犯过错误的地方。两个线程异步操作时,两个线程之间不存在阻塞模式,只会先完成的任务先返回过去了,不会有阻塞。两个线程异步操作时不会共享同一个函数,请注意的是两个线程会各复制同一个函数独立运行。只有同步操作时不存在复制行为。

你这说法有点笼统,函数内的局部变量当然都是独立的,但是如果函数内用到了成员变量(静态成员更不用说了),即使是传入的形参也要注意了,因为你引用的这个对象很可能在另一线程里也正在操作,这个时间就需要同步
解决方案:
愚蠢的人类,赶紧都拜倒在大魔王的脚下吧
解决方案:
引用43楼dongxinxi的回复:

Quote: 引用15楼office_2007的回复:
我也有一个犯过错误的地方。两个线程异步操作时,两个线程之间不存在阻塞模式,只会先完成的任务先返回过去了,不会有阻塞。两个线程异步操作时不会共享同一个函数,请注意的是两个线程会各复制同一个函数独立运行。只有同步操作时不存在复制行为。

你这说法有点笼统,函数内的局部变量当然都是独立的,但是如果函数内用到了成员变量(静态成员更不用说了),即使是传入的形参也要注意了,因为你引用的这个对象很可能在另一线程里也正在操作,这个时间就需要同步

我知道你说的意思,只是没有全部说出来而己。因为,给他们讲一个就不服气一个,讲二个他们听戏去吗。不只是静态成员,相关联的方法体外的Private变量也是一样的。就是两个线程都复制同一个变量,但是这个变量的声明Private时,两个线程的同一名变量都指向方法体外的该变量相同的Private变量。
解决方案:
引用39楼sp1234的回复:

如果单步调试,可以看到Task1.Result返回的是200万。然后看到上一步确实已经把返回对象给“意外地”追加到200数据了(而不是100万)。其实帖子的标题“[原创]vb.net应用多线程时的注意事项”,这种标题反映了求助者的心态。什么样的提问方式,决定了什么样的回答。

我可以把你丢脸着脸红,把你感到自己多么无知。
解决方案:
那么老师,请给我讲一讲,两个线程的同一名变量都指向方法体外的该变量相同的Private变量到底是怎么指向的呗连值类型,引用类型,值传递,引用传递都搞不清楚,只会说什么"复制","指向",大魔王老师,请说些愚蠢的人类能听懂的语言行吗
解决方案:
引用47楼Z65443344的回复:

那么老师,请给我讲一讲,两个线程的同一名变量都指向方法体外的该变量相同的Private变量到底是怎么指向的呗连值类型,引用类型,值传递,引用传递都搞不清楚,只会说什么"复制","指向",大魔王老师,请说些愚蠢的人类能听懂的语言行吗

看你的照片,你好像喜欢大魔王。我继续讲下去吧。两个线程复制同一个函数时。两个线程都有同一个相同变量,但是这个变量为Private时,这说明这个变量来至于方法体外的。所以,两个线程都引用该变量。只能是引用类型。值类型是只会复制一个的。所以,值类型无法改变原有的值。你好像动员你拥有的知识能力来挑战我似的。
解决方案:
看了帖子,觉得这热闹挺好的,我不攻击哪一方。古语说得好:敏而好学,不耻下问。注意:下问。好话就说到这里打住,希望各位共勉。。。嘿嘿!!!
解决方案:
引用31楼Z65443344的回复:

Quote: 引用29楼github_22161131的回复:
故意逃避了第一个问题么?没关系,你不清楚我继续问,递归的时候为什么不用复制就可以实现一级里面的变量不会影响另一级的呢?

其实就跟用公式计算一样一样的如果需要用同一个公式反复计算多次比如一个数乘以10%,再乘以10%,连续乘600次并不是每次把10%复制一份放到一个地方,而仅仅是保存中间结果就可以了

因为,一个人操作,所以没有冲突问题的。可是两个人同时操作时呢?两个人共享一个公式?一个人使用时,另一个人等待用完公式吗?只有两个人各拿同一个公式,才能两个人按自己的方式计算结果。你弯曲手指数一数那两个人共拥有几个相同公式来操作?一个人有相同公式一个,加一;另一个人也有相同公式一个又加一,一共加起来多少=?<小学数学>

时间: 2024-09-11 10:36:22

[原创]vb.net 应用多线程时的注意事项(2)的相关文章

[原创分享]应用多线程时的注意事项

问题描述 我现在开始公开几天前已经写好的答案.我最初考试大家的对这些问题的分析能力.可是我看到的结果看出,一些基本的多线程的RnunSynchronous方法的运行机制也根本不懂.如果,真的掌握不可能不懂返回结果应该是多少这样的具体数据.让我感叹的是这种不懂基本技术的人一大堆的人,让更多的人参与回答,可能出现更多的人犯错误.但是我这个帖子之后不再发帖讲课了,不懂礼貌的人太多了.根本不懂知识的人却反而要教人,我看了这种人太多了.这些人有个特点,比自己的技术分低锝很大差异的人,错误以为,这些人是不如

[原创]vb.net 编写过程中的注意事项

问题描述 我最近发现我的粉丝4个人!!!我本来不想发帖讲课,还是改变了我的主意.这意味着我不是极端.这不意味我经常发帖学习课目.还有感谢CSDN对礼仪问题上的努力和相关`措施.好了继续开始讲课,大家全体起立!!!如下`代码中运行起来好像不响应,主要不弹出带"ok"内容的消息框,也不会传输数据.大家动动脑筋查找原因吧.通过它又会新增知识.如果实在不行,我最后给出答案.PublicClassClass1SubMySub()DimTask1AsNewTask(OfIEnumerable(Of

java 线程池 程序顺序-java多线程时程序运行完成为什么不会自动关闭退出?(木有钱了,求指教)

问题描述 java多线程时程序运行完成为什么不会自动关闭退出?(木有钱了,求指教) 粘贴的大致代码如下: public static void main(String[] args) { int thread=0; ExecutorService pool = Executors.newFixedThreadPool(15);// 创建一个线程池 for (int i =666; i <= 888; i++) { for (int j = 0; j < 19; j++) { MyClass t

请教!!使用VB.net制作网站时,在datalist里面放了两个textbox,并要实现在textbox里面录入值,并加到数据库中。

问题描述 请教!!使用VB.net制作网站时,在datalist里面放了两个textbox,并要实现运行时在textbox里面录入值,并将值添加到数据库中.如图:[img=http://C:DocumentsandSettingsAdministrator.SA-DBA93C0E7E83桌面][/img]具体怎么实现??越祥细越好.先谢过了! 解决方案 解决方案二:图片没放上去,也就是一个数据绑定,后跟一个TEXTBOX空白框,再跟个数据绑定,后跟一个TEXTBOX空白框.

VB.NET2010 操作数据库时出错“不支持关键字: “date source”。”

问题描述 VB.NET2010操作数据库时出错"不支持关键字:"datesource"."出错问题如图所示请帮忙讲解如错原因.如何修改.大体讲一下原理.或扩展知识.谢谢了.代码为:PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimConnstringAsString="DateSource=.SQLEXPRES

C++ 关于MFC多线程编程的注意事项

  这篇文章主要介绍了C++ 关于MFC多线程编程的注意事项的相关资料,需要的朋友可以参考下 在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread 来创建一个工作线程,看一下这个函数的说明: 代码如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize =

Javascript中使用exec进行正则表达式全局匹配时的注意事项_正则表达式

本文就是介绍在使用 Javascript 中使用 exec 进行正则表达式全局匹配时的注意事项. 先看一下常见的用法: 复制代码 代码如下: <script type="text/javascript"> var pattern = /http:\/\/([^\/\s]+)/; alert(pattern.exec('http://www.codebit.cn')); // http://www.codebit.cn,www.codebit.cn alert(pattern

ThinkPHP后台首页index使用frameset时的注意事项分析_php实例

html的frameset标签在多窗口程序设计中有着广泛的应用,尤其是在项目后台页面部分.本文就来分析ThinkPHP后台首页index使用frameset时的注意事项.具体如下: 文件路径:aoli/admin/Lib/Action/IndexAction.class.php 代码如下: <?php class IndexAction extends Action{ public function index(){ $this->display(); } public function to

浅谈使用splice函数对数组中的元素进行删除时的注意事项_javascript技巧

使用splice函数对数组中的元素进行删除时的注意事项 删除值为c的元素: <script> var arr = new Array(); arr[0] = 'a'; arr[1] = 'b'; arr[2] = 'c'; arr[3] = 'c'; arr[4] = 'e'; for(var i=0; i<arr.length; i++){ if(arr[i] == 'c'){ arr.splice(i,1); i=i-1; // 必须对i减去1,否则后面的一个元素会被跳过去 } }