真正的多线程中,是没有变量的,如果有兴趣可以看一下函数式语言例如F#,GO, erlang等等
解决方案 »
- datagridview中显示值的问题
- 传参继承怎么实现
- 我的ListBox数据源为List时,改变list内容后无法同步显示
- WCF WPF SCOKET 网络架构 通信等的朋友请进,谢谢
- radiobutton的enable变化
- 讨论一个自定义控件属性的问题?
- DataGridview 单元格选中情况
- (WinForm)C#如何得到Windows的临时文件存储目录?
- C#获取TCP和UDP连接信息
- 我将一个ASP.net项目从2000的机子上拷到2003服务器上,在vs.net中运行,提示“无法在WEB服务器上启动调试.未将英项目配置为调试“这是怎么
- [求教]关于ComboBox手动设置焦点,调用窗体Validate事件后,不能正常下拉
- LINQ 查询下拉框级联问题
如果CPU是单核的,那才真是如楼主所言了
既然不会操作同一个数据,那为什么要Lock?
既然不lock就会变量混乱,那为什么说不会操作同一个数据?
我在一个类里,定义了一个字符串 string1 ,一开始 string str1=A, 到中间 str1=B, 最后 str1=C
多线程分别调用的这个类的实例,这个时候,如果不lock,str1 的值就乱套了,应该是A的时候 不一定是A了 这个变量是类里面的局部变量,并不是外部的共同变量。
按照网上的说法,类里面的变量都应该是安全的,所以我才选择的用类这种方法。
但是看起来,好像不对。
我在一个类里,定义了一个字符串 string1 ,一开始 string str1=A, 到中间 str1=B, 最后 str1=C
多线程分别调用的这个类的实例,这个时候,如果不lock,str1 的值就乱套了,应该是A的时候 不一定是A了 这个变量是类里面的局部变量,并不是外部的共同变量。
按照网上的说法,类里面的变量都应该是安全的,所以我才选择的用类这种方法。
但是看起来,好像不对。
-_-
你确定这样不叫同一个数据?我承认我近来是看玩笑的
在你的理解里, 排队了就一定慢了?从某个角度上来说,多线程确实有快不太多——特别是对于那种老式的单核CPU, 只进行那种纯粹的科学计算来说。换一个比较好理解的例子吧。
来了一车货要卸, 一个人负责把车上的东西一件件地往下搬到商店里(设为任务A), 另一个人负责把这些已经搬下来的东西放在商店的货架上(设为任务B)。如果设计多线程, 那就让车上的人往下搬的人(任务A)再增加到5个。好吧, 那你就说了: A的人有5个, B的才1个,那5个人到了B这里, 岂不是要排队了反而变慢?其实并不是这样, 5个人搬东西的速度并不是一致的, 而且车上到商店还有一段路, 这样会导致不同做A的人到达B的时候并不是在同一时间, 所以排队的机会是很少的。所以在5个一起做这种比较慢的事情, 速度虽然达不到5倍(偶尔还是得排一下队), 但效率也还是提高了……
你要做数据采集, 应该是从DB里取数据对吧?I/O操作是比较慢的, 比较适合用多线程。至于你所说的lock , 建议你把思路整理一下, 把最简洁最能表达你思想的代码做成一个能运行的小demo, 然后贴出来。 再让人家去改善, 我想这样会有更多人愿意花点时间来帮你。没有具体对象地空谈思路, 说不出个所以然来的
在你的理解里, 排队了就一定慢了?从某个角度上来说,多线程确实有快不太多——特别是对于那种老式的单核CPU, 只进行那种纯粹的科学计算来说。换一个比较好理解的例子吧。
来了一车货要卸, 一个人负责把车上的东西一件件地往下搬到商店里(设为任务A), 另一个人负责把这些已经搬下来的东西放在商店的货架上(设为任务B)。如果设计多线程, 那就让车上的人往下搬的人(任务A)再增加到5个。好吧, 那你就说了: A的人有5个, B的才1个,那5个人到了B这里, 岂不是要排队了反而变慢?其实并不是这样, 5个人搬东西的速度并不是一致的, 而且车上到商店还有一段路, 这样会导致不同做A的人到达B的时候并不是在同一时间, 所以排队的机会是很少的。所以在5个一起做这种比较慢的事情, 速度虽然达不到5倍(偶尔还是得排一下队), 但效率也还是提高了……
你要做数据采集, 应该是从DB里取数据对吧?I/O操作是比较慢的, 比较适合用多线程。至于你所说的lock , 建议你把思路整理一下, 把最简洁最能表达你思想的代码做成一个能运行的小demo, 然后贴出来。 再让人家去改善, 我想这样会有更多人愿意花点时间来帮你。没有具体对象地空谈思路, 说不出个所以然来的
感谢,你说的我明白了,我可能对多线程的理解还是有些问题。哎,文人相轻啊,不明白了才来问,然后大家一同而上开始蔑视你。文人相轻,真是无语了。
呵呵 文人相轻 还是言重了……
其实程序员都还是比较单纯吧 不喜欢掩饰什么 只是有时表达的不太恰当而已……无码无真相, 如果问题比较复杂最好还是贴代码。
相信你自己 也相信CSDN的朋友, 大家一起努力提高吧……
下面写得脑子有点乱,不是很擅长线程,好不容易弄好
和实际有点区别
典型的办法就是
AI开始时
AI.ready=true;
AI.notify();
server.isReady=true;
server.wait()另一边
AI 开始思考 思考结束后,结算
AI.doClick();
while (operation_security.isReady==false)
{}
//确保开始结算的时候server停止,不接受点击消息,直到结算完毕打开server
server.isReady=true;
server.awake()
开始结算
void awake(){ if (this.isReady) synchronize(this){this.notify();}}}
我实际的代码有些不同,但思路是如此
我在一个类里,定义了一个字符串 string1 ,一开始 string str1=A, 到中间 str1=B, 最后 str1=C
多线程分别调用的这个类的实例,这个时候,如果不lock,str1 的值就乱套了,应该是A的时候 不一定是A了 这个变量是类里面的局部变量,并不是外部的共同变量。
按照网上的说法,类里面的变量都应该是安全的,所以我才选择的用类这种方法。
但是看起来,好像不对。
为嘛不定义三个变量呢