多线程要求线程A一直实时产生数据data 并存入到数组array中、 线程B又要对array处理

有时想起 2018-08-01 04:26:08
问:线程B怎么做? 因为array肯定是在一直增长的
我知道线程B应该要用到lock这个关键字。
大神能否例举个demo演示下
...全文
397 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿龙术士 2018-08-07
  • 打赏
  • 举报
回复
弄两个定时任务,简单点用Time就行,一个产生数据,一个计算数据。
竞天问 2018-08-07
  • 打赏
  • 举报
回复
如果LZ是在上学呢?
如果就是有兴趣深入底层呢?
aa45942 2018-08-06
  • 打赏
  • 举报
回复
如果需要自行实现,那么必须标记好队列的头尾,并且给写操作上锁,写操作包括队列数据更改,位置标记、空数据标记的修改等,同时每次填充数据前需要检查缓存是否充足,每次读的时候是否越界等,至于其他拓展比如数据搜索等,看你的实际情况了
aa45942 2018-08-06
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
20 年前的 java 书籍中容易被最垃圾的说法借用的模式之一是叫做“生产者-消费者”模式的东西,有的人说“我启动两个线程,一个生产、一个消费、中间弄一个队列(或者如你所说是什么Array)”。

20年之后,至少在 .net 系统中,完全不是这样设计并发异步程序的。我们写
var x = 1;
Task.Run(()=>{
call(x);
});
.......
甚至都可以,这类代码在 .net 中又不下10种不同写法,但是至少一点是一致的,就是直接了当。

线程池本身就是队列管理,而且队列只是极其底层的一点概念(线程池有本质的高级功能)。那么传入的参数对象 x 自然地被编排到任务中,并且自然地以并发、异步形式去调用 call 方法。并且线程池是并发多线程调度的机制。用不着你自己发明什么“生产者、消费者、队列”,而且重点在于更多的必要并发多线程异步编程知识。那么纠结于“2个线程,一个 Array”这明显就是推着赶着马车进城、在.net 上学习写20年前的java代码了。


不论什么编程语言,生产-消费模型都是有需求的,虽然.net本身有不少相关的类来支持这些模型,但是若是不复杂的问题重复造轮子未尝不可,毕竟有时候运行效率很重要,为了实现简单功能用已有的系统类会拖慢整个系统的速度(比如c#有关sql的类的许多方法,执行速度真的不能忍,比如执行事务操作跟我自己拼接查询字符串,数据量大的时候执行速度差距甚至能到两个量级),我通常都是在快速开发的时候使用自己定义的方法包装系统大类的功能,后期优化的时候再看情况去手动实现或者优化那些功能,而不是“嗯,系统提供了这个功能,我不需要实现了”,这样是永远没有办法成为大牛的

LZ的问题可能就是一个线程需要实时读入数据,而另一个线程消费数据,实际上这个问题不是什么线程的问题,就是一个环形缓冲

低于4.0可以用
Queue mySyncdQ = Queue.Synchronized( new Queue());

大等于4.0可以用
var queue = new ConcurrentQueue<CustomerType>();

这两个都是线程安全的fifo缓冲,具体用法百度
南天空 2018-08-06
  • 打赏
  • 举报
回复
我觉得专业大神说的对,直接用Task就好,.net中已经做好了一些线程调度的方案,如果你不是对线程特别熟悉那你只需要知道其用法就行。
有时想起 2018-08-02
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
数组一旦创建,其规模就是固定的,不可变化的,所以 array肯定是在一直增长的 是不成立的
在错误的前提下,是不可能得到正确的结论的

B线程只是读取数据,并没有 lock 的必要

我表述的不好 不是数组 是泛型类
五更琉璃 2018-08-02
  • 打赏
  • 举报
回复
百度“线程 生产消费者”
  • 打赏
  • 举报
回复
20 年前的 java 书籍中容易被最垃圾的说法借用的模式之一是叫做“生产者-消费者”模式的东西,有的人说“我启动两个线程,一个生产、一个消费、中间弄一个队列(或者如你所说是什么Array)”。

20年之后,至少在 .net 系统中,完全不是这样设计并发异步程序的。我们写
var x = 1;
Task.Run(()=>{
call(x);
});
.......
甚至都可以,这类代码在 .net 中又不下10种不同写法,但是至少一点是一致的,就是直接了当。

线程池本身就是队列管理,而且队列只是极其底层的一点概念(线程池有本质的高级功能)。那么传入的参数对象 x 自然地被编排到任务中,并且自然地以并发、异步形式去调用 call 方法。并且线程池是并发多线程调度的机制。用不着你自己发明什么“生产者、消费者、队列”,而且重点在于更多的必要并发多线程异步编程知识。那么纠结于“2个线程,一个 Array”这明显就是推着赶着马车进城、在.net 上学习写20年前的java代码了。
  • 打赏
  • 举报
回复
什么叫做“多线程要求线程A一直实时产生数据”?是定时的任务就说定是驱动机制,用不着纠结什么线程。
  • 打赏
  • 举报
回复
线程,在有些人脑子中,成了毒瘤。真的还是不要学什么线程概念。
xuzuning 2018-08-01
  • 打赏
  • 举报
回复
数组一旦创建,其规模就是固定的,不可变化的,所以 array肯定是在一直增长的 是不成立的
在错误的前提下,是不可能得到正确的结论的

B线程只是读取数据,并没有 lock 的必要
壶中日月长 2018-08-01
  • 打赏
  • 举报
回复
BlockingCollection了解下。
闭包客 2018-08-01
  • 打赏
  • 举报
回复
线程A、线程B 都要 lock,lock array 就行了。
缭绕飘渺 2018-08-01
  • 打赏
  • 举报
回复
可以使用线程安全的队列或列表

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧