Parallel的陷阱

var nums = Enumerable.Range(1,4).ToArray();
            int total = 0;
            Parallel.For<int>(
                fromInclusive: 0,
                toExclusive: nums.Length,
                /* 陷阱 */
                localInit: () => 1,
                body: (i, loopState, subtotal) =>
                {
                    return subtotal + nums[i];
                },
                localFinally: i => Interlocked.Add(ref total, i)
                );
            Console.WriteLine("total={0}",total);
localInit会根据启动的线程来调用多次。

如果只启用了一个线程,结果是11,二个是否2
时间: 2024-10-11 20:31:23

Parallel的陷阱的相关文章

【进阶修炼】&mdash;&mdash;改善C#程序质量(5)

71, 区分异步和多线程的应用场景. 计算机的很多硬件,如硬盘,光驱,声卡,网卡都有DMA(Direct Memory Access)功能,它可以不占用cpu的资源,而异步的提出恰恰就是基于这个的.而多线程是操作系统上的并行执行的代码,是会占用cpu资源的.所以关于这两种的使用场景建议是:1)对于I/0密集型操作使用异步.2)对于计算密集型操作使用多线程. 72, 在线程同步中使用信号量. 值类型是不能被锁定的,引用类型上的等待机制,分为锁定和信号同步.锁定通过lock关键字或Monitor来完

编写高质量代码改善C#程序的157个建议——建议83:小心Parallel中的陷阱

建议83:小心Parallel中的陷阱 Parallel的For和ForEach方法还支持一些相对复杂的应用.在这些应用中,它允许我们在每个任务启动时执行一些初始化操作,在每个任务结束后,又执行一些后续工作,同时,还允许我们监视任务的状态.但是,记住上面这句话“允许我们监视任务的状态”是错误的:应该把其中的“任务”改成“线程”.这,就是陷阱所在. 我们需要深刻理解这些具体的操作和应用,不然,极有可能陷入这个陷阱中去.下面体会这段代码的输出是什么,如下所示: static void Main(st

异步陷阱之IO篇

很多教程和资料都强调流畅的用户体验需要异步来辅助,核心思想就是保证用户前端的交互永远有最高的优先级,让一切费时的逻辑通通放到后台,等到诸事完备,通知一下前端给个提示或者继续下一步.随着.NET发展,async和await关键字的推广,Task Parallel Library (TPL)的稳步发展, 异步编程也越来越多的被重视和采用,很多时候非常便利的解决各种性能问题,但同时也带来了很多的陷阱.?? 这里我抛出一个实际项目中遇到的陷阱,先简单交代一下故事背景:SpreadJS产品有一个Excel

C#中的异步陷阱

本文主要介绍异步编程中,常见的异步陷阱: 1.Async没有异步运行 我们来看下面代码,猜测他是如何打印出下面的三个字符串: /*Gotcha #1: Async does not run asynchronously*/ static void Main(string[] args) { Console.WriteLine("begin" + "[" + DateTime.Now.ToString() + "]"); var child = G

大量数据快速插入方法探究[nologging+parallel+append]

大量数据快速插入方法探究 快速插入千万级别的数据,无非就是nologging+parallel+append. 1     环境搭建 构建一个千万级别的源表,向一个空表insert操作. 参考指标:insert动作完成的实际时间. SQL> drop table test_emp cascadeconstraints purge; Table dropped. SQL> create table test_emp as select *from emp; Table created. SQL&

java笔记--笔试中极容易出错的表达式的陷阱

我相信每一个学过java的人儿们都被java表达式虐过,各种"肯定是它,我不可能错!",然后各种"尼玛,真假,怎么可能?",虽然在实际开发中很少会真的让你去使用那些知识,但熟悉表达式的陷阱对于理解java数据类型在内存中的存储和运算以及JVM工作的原理有很大的帮助,最主要的,面试题太能考这些玩意了,有些坑当时爬出来了,过几天再做又会义无反顾的跳进去,于是我整理了自己做错过的一些题,也搜集了一些充满恶意的表达式方面的小题目,放在此处,警世: 问题 结果 脱坑必备 Sy

cocos2dx-3 addImageAsync陷阱

addImageAsync异步加载未响应回调前调用unbindImageAsync撤销消息回调void TextureCache::unbindImageAsync(const std::string& filename){    _imageInfoMutex.lock();    if (_imageInfoQueue && !_imageInfoQueue->empty())    {        std::string fullpath = FileUtils::g

当心商业智能的“陷阱”

当谈到有价值的,具有真实见解的评论,我总是可以指望每周五参加我#商业智能讨论#话题的参与者们.我最近开始小组讨论这个问题:“什么是商业智能系统的五大最差实践?” 那么让我们来看看为什么BI项目有时并不完全兑现其承诺.毕竟,失败是非常有益的. 这是我们编译的列表: 组织团体在BI项目中犯的一些最糟糕的错误 技术/工具: “认为BI工具将弥补对业务的不理解” “认为BI工具将代替BI解决业务问题” “为所有类型的用户提供通用的解决方案或工具——商业智能不是一个放之四海而皆准的通用的解决方案” “没有

Linux环境下线程消息同步的陷阱

我们程序中常常会使用到线程间的消息同步处理,比如以下一段伪码 var message = "": void func()  {   1. 启动线程Thread(该线程中填充message的内容):   2. 阻塞,直到等待到完成message填充的事件:   3. 处理message:   .... } void Thread()  {   1. 通过某种处理填充message:   2. 触发func中的阻塞事件: } 我们通常会使用条件变量来完成类似情况的线程同步处理 比如wind