Tasks 多核查找最大最小值问题
先贴下代码
_Datas.ParallelForEach(arg_nDataStartIndex, arg_nDataCount, (data) =>
{
dMax = dMax.Max(data.HighPrice);
dMin = dMin.Min(data.LowPrice);
});
Max,Min的实现如下:
public static T Min<T>(this IComparable<T> arg_oThis, T arg_oOther)
{
return arg_oThis.CompareTo(arg_oOther) < 0 ? (T)arg_oThis : arg_oOther;
} public static T Max<T>(this IComparable<T> 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次冲突
Tasks 多核查找最大最小值问题的更多相关文章
- 【转载】C#中List集合使用Min()方法查找到最小值
在C#的List集合操作中,有时候需要查找到List集合中的最小值,此时可以使用List集合的扩展方法Min方法,Min方法有2种形式,一种是不带任何参数的形式,适用于一些值类型变量的List集合,另 ...
- 基于visual Studio2013解决算法导论之016查找最大值最小值
题目 查找最大.最小值 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...
- java数组回顾---线性查找最大值最小值---二分查找
import java.util.Scanner; public class ArrayDemo { public static void main(String []args) { //------ ...
- POJ 3264 Balanced Lineup (线段树查找最大最小值)
http://poj.org/problem?id=3264 题意:给你一个长度为n的序列a[N] (1 ≤ N ≤ 50000),询问Q(1 ≤ Q ≤ 200000) 次,每次输出[L, R]区间 ...
- c++顺序表(数组)查找最大最小值
#include <iostream> #define MAXSIZE 100 using namespace std; void find(int a[],int m) {int min ...
- 常用的STL查找算法
常用的STL查找算法 <effective STL>中有句忠告,尽量用算法替代手写循环:查找少不了循环遍历,在这里总结下常用的STL查找算法: 查找有三种,即点线面: 点就是查找目标为单个 ...
- POJ 3171 区间覆盖最小值&&线段树优化dp
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4715 Accepted: 1590 D ...
- OpenCV 中获取图像或矩阵最大、最小值的简便方法
C++: void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc ...
- 计算机程序的思维逻辑 (53) - 剖析Collections - 算法
之前几节介绍了各种具体容器类和抽象容器类,上节我们提到,Java中有一个类Collections,提供了很多针对容器接口的通用功能,这些功能都是以静态方法的方式提供的. 都有哪些功能呢?大概可以分为两 ...
随机推荐
- webrtc初探
0.闲来无事,想研究webrtc,看了一些网上的文章之后,觉得谬误较多,以讹传讹的比较多,自己试验了一把,记录一下. 官网的写的教程在实践中也觉得不用那么复杂,有种落伍与繁冗的感觉. 1.我想看的是w ...
- Ubuntu下编译Android JNI实例全过程
第一步:保证make和gcc可用 在shell中输入make-v.不报错就是对的.(可參考http://wenku.baidu.com/view/d87586c24028915f804dc24a.ht ...
- apk程序查找方法调用
有android killer,现在ida对android的支持等一些方便工具,此篇(关于搜索和修改代码)废弃. 没有好的调试工具下 常用插代码(如果怕影响寄存器值,可以将.locals xxx改多几 ...
- String、StringBilder和StringBuffer之间的区别
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuild ...
- Hadoop每日一讨论整理版
这是我在几个QQ群发起的Hadoop每日一讨论小活动,每天中午2点左右发出一个关于Hadoop的知识片段,在此做一个整理. [每日一讨论]之计算框架(2013-5-21) 就计算框架而言,Hadoop ...
- enumerated types
控制台手动输入. package enums; import java.util.Scanner; public class EnumTest { public static void main(St ...
- 端口扫描 开启 防火墙 iptables SELinux
Linux 如何打开端口 - lclc - 博客园 https://www.cnblogs.com/lcword/p/5869522.html linux如何查看端口相关信息_百度经验 https:/ ...
- CH 5102 Mobile Service(线性DP)
CH 5102 Mobile Service \(solution:\) 这道题很容易想到DP,因为题目里已经说了要按顺序完成这些请求.所以我们可以线性DP,但是这一题的状态不是很好设,因为数据范围有 ...
- [转]GPS NEMA 0183协议
一. NMEA0183标准语句(GPS常用语句) $GPGGA例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000 ...
- (linux)mmccard驱动的读写过程解析
mmc io的读写从mmc_queue_thread()的获取queue里面的request开始. 先列出调用栈,看下大概的调用顺序, 下面的内容主要阐述这些函数如何工作. host->op ...