博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tasks 多核查找最大最小值问题
阅读量:5251 次
发布时间:2019-06-14

本文共 1695 字,大约阅读时间需要 5 分钟。

先贴下代码

_Datas.ParallelForEach(arg_nDataStartIndex, arg_nDataCount, (data) =>            {                          dMax = dMax.Max(data.HighPrice);                dMin = dMin.Min(data.LowPrice);                              });
Max,Min的实现如下:

public static T Min
(this IComparable
arg_oThis, T arg_oOther) { return arg_oThis.CompareTo(arg_oOther) < 0 ? (T)arg_oThis : arg_oOther; } public static T Max
(this IComparable
arg_oThis, T arg_oOther) { return arg_oThis.CompareTo(arg_oOther) > 0 ? (T)arg_oThis : arg_oOther; }

代码很简洁,但是其实问题很大。得到的最大值有时候(一般10次会有2次)是一个比较大的值,但不是最大值。 最小值得到是比较小的值

主要问题是 dMax = dMax.Max(data.HighPrice) 不是同步的。

但是又不想用lock 

想用 Interlocked.CompareExchange 这个函数达到取极值的效果

代码如下:

_Datas.ParallelForEach(arg_nDataStartIndex, arg_nDataCount, (data) =>            {                double m0, m1;                do                {                    m0 = dMin;                    m1 = dMin;                    if (data.LowPrice >= m0)                        break;                    m1 = data.LowPrice;                } while (m0 != Interlocked.CompareExchange(ref dMin, m1, m0));                do                {                    m0 = dMax;                    m1 = data.HighPrice;                    if (m1 <= m0)                        break;                } while (m0 != Interlocked.CompareExchange(ref dMax, m1, m0));                //dMax = dMax.Max(data.HighPrice);                //dMin = dMin.Min(data.LowPrice);                              });

其中的while用于检测是否发生过冲突,如果是则再次比较

经过检测4核上1000个数据发生了10次冲突

转载于:https://www.cnblogs.com/norsd/p/6359360.html

你可能感兴趣的文章
nginx修改内核参数
查看>>
【欧拉函数模板题】最大公约数
查看>>
C 筛选法找素数
查看>>
TCP为什么需要3次握手与4次挥手(转载)
查看>>
IOC容器
查看>>
织梦仿站第三课:网站的文件分割
查看>>
Windows 2003全面优化
查看>>
URAL 1002 Phone Numbers(KMP+最短路orDP)
查看>>
web_day4_css_宽度
查看>>
用sql删除数据库重复的数据的方法
查看>>
学习笔记21—PS换图片背景
查看>>
electron入门心得
查看>>
格而知之2:UIView的autoresizingMask属性探究
查看>>
Spring3.0 AOP 具体解释
查看>>
我的Hook学习笔记
查看>>
EasyUI DataGrid 中字段 formatter 格式化不起作用
查看>>
海量数据存储
查看>>
js中的try/catch
查看>>
[导入]玫瑰丝巾!
查看>>
自动从网站上面下载文件 .NET把网站图片保存到本地
查看>>