精易论坛

标题: 多线程大佬这边请,请教逻辑 [打印本页]

作者: 镇坛道德标杆    时间: 2017-3-10 11:00
标题: 多线程大佬这边请,请教逻辑
多线程批量注Ce的时候,想精确控制注Ce数量,又绝对不想TerminateThread,该怎么个逻辑呢?

我现在的做法是弄一些全局变量,每个代码片段都利用CAS判断一下。但说实话还是不精确(应该说是不敢精确),比如DX你收到了钱都扣了你总不能丢掉吧,于是这个时候就有可能超出数量,而且最严重的情况超出(线程数 - 1)个。

我还有个思路是:例如4线程,注Ce剩余数到4的时候,就开始逐渐收缩线程数,这样最后一个的时候只有一条线程,但具体实现又有点头痛,毕竟还要考虑时间。

有大佬有好的建议么?感谢



作者: 竹子软件    时间: 2017-3-10 11:09
起一条检测线程,如果设置的是4线程,那么检测当前注册数据是否小于总注册数量-4,如果小于4就创建一条注册线程,就不再创建,不过还要判断当前正在注册的线程数最多只能创建4条,这个你自己处理
作者: 竹子软件    时间: 2017-3-10 11:10
漏了两字
。。。否则就不再创建。。。
作者: 镇坛道德标杆    时间: 2017-3-10 11:15
suger 发表于 2017-3-10 11:10
漏了两字
。。。否则就不再创建。。。

嗯  我明白你的意思   但我是用池化的思路来写的   不会重复创建线程   不喜欢那样
作者: 进击    时间: 2017-3-10 12:11
junkboy 发表于 2017-3-10 11:15
嗯  我明白你的意思   但我是用池化的思路来写的   不会重复创建线程   不喜欢那样

上次你说道的 线程池 停止问题,我到现在还没想出来。。。

刚好又有需要,能说说你想出来的办法么==。

没帮你解决问题,还问你问题。。。感觉怪不好意思的。。。
作者: 猥琐小胖子    时间: 2017-3-10 12:13
注册之前判断下已注册成功的数量,这边加通行证或者锁。线程到这边只会排队。
作者: 凌哥    时间: 2017-3-10 12:15
你可以看我之前开源的刷英雄时刻源码,我是这样做的:
线程中判断的总数 = 总数 - 线程数量
然后,最终全部跳出循环后,当前处理完成的数量 绝对 < 总数
接着再开一条线程,一点点补充上去即可
作者: 凌哥    时间: 2017-3-10 12:16
或者也可以这样(猜测):注册之前就增加注册总数(变量)比较好处理
作者: 镇坛道德标杆    时间: 2017-3-10 12:25
猥琐小胖子 发表于 2017-3-10 12:13
注册之前判断下已注册成功的数量,这边加通行证或者锁。线程到这边只会排队。

注册前判断是没用的   因为注册有几个流程   

初始化 → 发短X → 等待短X → 收到短X → 提交之前的一系列步骤 → 提交

现在的问题是收到之前判断是没有什么大问题的,但是只要收到了,出于成本考虑就不会再判断了而是一路放行,就会有可能不精确(尤其是【提交之前的一系列步骤】比较耗时的情景下)。所以我才考虑收缩线程数

补充内容 (2017-3-10 12:29):
整个代码段加锁的话又太暴力了。。。
作者: 镇坛道德标杆    时间: 2017-3-10 12:26
你凌哥i 发表于 2017-3-10 12:16
或者也可以这样(猜测):注册之前就增加注册总数(变量)比较好处理

注册之前就增加注册总数(变量)比较好处理

对的   我也用过这个思路  但是又觉得会影响速度    所以想寻找一个更好且安全的思路
作者: 凌哥    时间: 2017-3-10 12:27
junkboy 发表于 2017-3-10 12:26
注册之前就增加注册总数(变量)比较好处理

对的   我也用过这个思路  但是又觉得会影响速度    所以 ...

不会影响的
作者: 镇坛道德标杆    时间: 2017-3-10 12:28
WYX89898 发表于 2017-3-10 12:11
上次你说道的 线程池 停止问题,我到现在还没想出来。。。

刚好又有需要,能说说你想出来的办法么==。 ...

我没用线程池,用的一些全局变量和Interlocked函数控制的
作者: 大兔崽子    时间: 2017-3-10 13:06
是不是这样子来着、、、

作者: xdaiding    时间: 2017-3-10 13:28
笨人用笨方法
要注CE的数量 为总数  
正在执行中的 为执行中任务数  
注册CE成功的 为成功数
往线程池中投递的时候 先判断一下 执行中任务数+成功数是不是<总数 <的话就往里投 =的话就等待那个执行中的任务返回是不是成功  不成功然后再投 说的有点笼统 大概就是这个意思
作者: 小明无敌    时间: 2017-3-10 14:06
我感觉你注册几个就添加几个。他怎么会出错呢。
作者: 竹子软件    时间: 2017-3-10 19:24
junkboy 发表于 2017-3-10 11:15
嗯  我明白你的意思   但我是用池化的思路来写的   不会重复创建线程   不喜欢那样

不管什么方法,原理就一个,注册前判断正在注册的有几个,还剩几个没注册的,就是判断一下就行了,多线程无非就是加锁或者通过线程等待的方法,某个线程注册好了通知另外的线程。。。




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4