真正的多线程中,是没有变量的,如果有兴趣可以看一下函数式语言例如F#,GO, erlang等等

解决方案 »

  1.   

    操作同一个数据,多线程肯定是要排队的,如果这样就否定多线程真是可笑,因为操作共用数据只是一个线程中很小的一块。
    如果CPU是单核的,那才真是如楼主所言了
      

  2.   

    如果你能分解成多个exe并行,说明之间并不存在共享数据访问,那么同样可以分解成多个线程。
    既然不会操作同一个数据,那为什么要Lock?
    既然不lock就会变量混乱,那为什么说不会操作同一个数据?
      

  3.   

    如果分解成多个exe可行,那你就可以new多个实例,应该是操作了同一个实例中的成员数据造成的。
      

  4.   


    我在一个类里,定义了一个字符串 string1 ,一开始 string str1=A,  到中间  str1=B, 最后 str1=C 
    多线程分别调用的这个类的实例,这个时候,如果不lock,str1 的值就乱套了,应该是A的时候 不一定是A了 这个变量是类里面的局部变量,并不是外部的共同变量。
    按照网上的说法,类里面的变量都应该是安全的,所以我才选择的用类这种方法。
    但是看起来,好像不对。
      

  5.   


    我在一个类里,定义了一个字符串 string1 ,一开始 string str1=A,  到中间  str1=B, 最后 str1=C 
    多线程分别调用的这个类的实例,这个时候,如果不lock,str1 的值就乱套了,应该是A的时候 不一定是A了 这个变量是类里面的局部变量,并不是外部的共同变量。
    按照网上的说法,类里面的变量都应该是安全的,所以我才选择的用类这种方法。
    但是看起来,好像不对。
    -_-
    你确定这样不叫同一个数据?我承认我近来是看玩笑的
      

  6.   

    如果别人说你“不是多线程”,一定是从整个流程设计的角度。而你把它理解为“用了lock语句”,这就没什么好说的了。你现在可能还根本无法理解“设计过程”问题,懒得做而只喜欢抠字眼,只能纠结于一个“是”或者“不是”的字眼。
      

  7.   


    在你的理解里, 排队了就一定慢了?从某个角度上来说,多线程确实有快不太多——特别是对于那种老式的单核CPU, 只进行那种纯粹的科学计算来说。换一个比较好理解的例子吧。
    来了一车货要卸, 一个人负责把车上的东西一件件地往下搬到商店里(设为任务A), 另一个人负责把这些已经搬下来的东西放在商店的货架上(设为任务B)。如果设计多线程, 那就让车上的人往下搬的人(任务A)再增加到5个。好吧, 那你就说了: A的人有5个, B的才1个,那5个人到了B这里, 岂不是要排队了反而变慢?其实并不是这样, 5个人搬东西的速度并不是一致的, 而且车上到商店还有一段路, 这样会导致不同做A的人到达B的时候并不是在同一时间, 所以排队的机会是很少的。所以在5个一起做这种比较慢的事情, 速度虽然达不到5倍(偶尔还是得排一下队), 但效率也还是提高了……
    你要做数据采集, 应该是从DB里取数据对吧?I/O操作是比较慢的, 比较适合用多线程。至于你所说的lock , 建议你把思路整理一下, 把最简洁最能表达你思想的代码做成一个能运行的小demo, 然后贴出来。 再让人家去改善, 我想这样会有更多人愿意花点时间来帮你。没有具体对象地空谈思路, 说不出个所以然来的
      

  8.   


    在你的理解里, 排队了就一定慢了?从某个角度上来说,多线程确实有快不太多——特别是对于那种老式的单核CPU, 只进行那种纯粹的科学计算来说。换一个比较好理解的例子吧。
    来了一车货要卸, 一个人负责把车上的东西一件件地往下搬到商店里(设为任务A), 另一个人负责把这些已经搬下来的东西放在商店的货架上(设为任务B)。如果设计多线程, 那就让车上的人往下搬的人(任务A)再增加到5个。好吧, 那你就说了: A的人有5个, B的才1个,那5个人到了B这里, 岂不是要排队了反而变慢?其实并不是这样, 5个人搬东西的速度并不是一致的, 而且车上到商店还有一段路, 这样会导致不同做A的人到达B的时候并不是在同一时间, 所以排队的机会是很少的。所以在5个一起做这种比较慢的事情, 速度虽然达不到5倍(偶尔还是得排一下队), 但效率也还是提高了……
    你要做数据采集, 应该是从DB里取数据对吧?I/O操作是比较慢的, 比较适合用多线程。至于你所说的lock , 建议你把思路整理一下, 把最简洁最能表达你思想的代码做成一个能运行的小demo, 然后贴出来。 再让人家去改善, 我想这样会有更多人愿意花点时间来帮你。没有具体对象地空谈思路, 说不出个所以然来的
    感谢,你说的我明白了,我可能对多线程的理解还是有些问题。哎,文人相轻啊,不明白了才来问,然后大家一同而上开始蔑视你。文人相轻,真是无语了。
      

  9.   


    呵呵 文人相轻 还是言重了……
    其实程序员都还是比较单纯吧 不喜欢掩饰什么 只是有时表达的不太恰当而已……无码无真相, 如果问题比较复杂最好还是贴代码。
    相信你自己 也相信CSDN的朋友, 大家一起努力提高吧……
      

  10.   

    我用java做桌游,当AI思考时,其他东西都暂停,AI决策完成出牌计算时,结算之前让其他的东西都暂停
    下面写得脑子有点乱,不是很擅长线程,好不容易弄好
    和实际有点区别
    典型的办法就是
    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();}}}
     我实际的代码有些不同,但思路是如此
      

  11.   


    我在一个类里,定义了一个字符串 string1 ,一开始 string str1=A,  到中间  str1=B, 最后 str1=C 
    多线程分别调用的这个类的实例,这个时候,如果不lock,str1 的值就乱套了,应该是A的时候 不一定是A了 这个变量是类里面的局部变量,并不是外部的共同变量。
    按照网上的说法,类里面的变量都应该是安全的,所以我才选择的用类这种方法。
    但是看起来,好像不对。
    为嘛不定义三个变量呢