搜索
查看: 3802|回复: 3

关于线程共享表结构的疑问 [完结]

[复制链接]

1

主题

2

帖子

13

积分

新手入门

Rank: 1

积分
13
发表于 2014-2-8 10:02:25 | 显示全部楼层 |阅读模式
本帖最后由 longxiao7 于 2014-2-8 12:42 编辑

  1. io.open();

  2. import thread.table;
  3. import thread.works;

  4. var data = thread.table("data");

  5. newThread = thread.works( 1,
  6.         function( id ) {
  7.                 import thread.table;
  8.                 data = thread.table("data");
  9.                 data.push(id);
  10.                 io.print(id);
  11.                 return;
  12.         }
  13. );

  14. var newArray = {1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21};
  15. for key,value in newArray
  16. {
  17.         newThread.push(value);
  18. }
复制代码



newArray  和 data 的结构是否会一样呢?

当我使用
for key,v in data.each()
{
        io.print(key,'----',v);
}
输出的时候 和自己预期的结果有很大差异,原因是什么?

还有一个问题 如何在所有的newThread都结束的时候 再执行某段代码 (不是很了解线程
回复

使用道具 举报

5

主题

442

帖子

2420

积分

五级会员

Rank: 8Rank: 8

积分
2420
发表于 2014-2-8 12:00:03 | 显示全部楼层

你这里可能有逻辑错误, push() 是追加,如果你重复执行线程,共享表的键值不一定是相等的。 注意在开发环境中共享表也是所有线程共享的( 调试只会创建线程

你这里可能有逻辑错误,
push() 是追加,如果你重复执行线程,共享表的键值不一定是相等的。
注意在开发环境中共享表也是所有线程共享的( 调试只会创建线程而不是新进程 )。

所以你需要这样写结果就是一致的:
  1. import thread.table;
  2. import thread.works;

  3. var data = thread.table("data2");
  4. var works = thread.works( 1,
  5.     function( id ) {
  6.             import thread.table;
  7.             data = thread.table("data2");
  8.             data.push(id);
  9.             io.print(id);
  10.             return;
  11.     }
  12. );

  13. io.open();
  14. var array = {1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21};
  15. for key,value in array{
  16.         works.push(value);
  17. }

  18. //等待线程执行完成
  19. works.waitClose()

  20. for key,v in data.each(){
  21.         io.print(key,'----',v);
  22. }

  23. //清空共享表
  24. data.pop( data.count() )
复制代码


thread.works使用wait() 或 waitClose() 等待所有线程结束。

评分

参与人数 2银币 +12 收起 理由
handongcn + 10 赞一个!
longxiao7 + 2 很给力!

查看全部评分

回复

使用道具 举报

1

主题

2

帖子

13

积分

新手入门

Rank: 1

积分
13
 楼主| 发表于 2014-2-8 12:41:59 | 显示全部楼层

哦 我明白了 因为不同线程是并行的,所以在不锁定的情况下,可能会不按照顺序push 这时候如果外面在同时输出,就可能会因为数据同时在变化 所以输出结果看

哦   我明白了
因为不同线程是并行的,所以在不锁定的情况下,可能会不按照顺序push
这时候如果外面在同时输出,就可能会因为数据同时在变化 所以输出结果看起来是不一样的
实际上在线程结束以后 是一样的

我的问题出在错误认为for遍历是在所有线程结束以后   感谢楼上的回答
回复

使用道具 举报

2

主题

38

帖子

258

积分

二级会员

Rank: 3Rank: 3

积分
258
发表于 2016-4-25 09:32:54 | 显示全部楼层

学习了

学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-21 23:36 , Processed in 0.062500 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表