zoukankan      html  css  js  c++  java
  • c# Parallel.For 并行编程 执行顺序测试

     因为有个for 实际执行结果尽管是按照for里边的顺序执行,但处理器让哪个分线程先执行,谁先处理完就不一定了.

    对于要求结果需要先后顺序的,比如对text内容的操作, 用并行 Parallel.For 操作,不做进一步优化处理,那结果就不是想要的了,还要l用它的并行的功能所以要多程序进行改进,

    我使用的做法是初始化buffer list 把list数组的顺序定下来,在循环中,把对应的值顺序赋值给list.    这样做可能写的有点死,根据实际应用调整启动循环的数量实际运行起来效果不错.

    做了个简单的测试,同时赋值多个字符串,打印list字符串的值,

     string a = "sssssssssssssssssssssssssssssssssssssssssss";
                string b = "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj";
                string c = "nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmm";
                string d = "ssssssssssssssssssssssssssssssssssssssssssssssssss";
                string o = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
                string f = "ttttttttttttttttttttttttttttttttttttttttttttttttttt";
                List<string> la = new List<string>();
                la.Add(a);
                la.Add(b);
                la.Add(c);
                la.Add(d);
                la.Add(o);
                la.Add(f);
                Parallel.For(0, 6 /*portion*/, (i, ParallelLoopState) =>
                {
                  Console.WriteLine(la[i]) ;
                });

    结果:

    顺序大变

    再运行一次

    因为设置断点,程序停了一会显示按照先后了

     在运行一次,去掉断点

    总结:对需要先后顺序的操作明显满足不了

    本来已经加上一下代码就可以了

                      if (i == 0)
                             {
                                 using (mmf_reader = mmf.CreateViewAccessor(0, portion1, MemoryMappedFileAccess.Read))
                                 {
                                     buffer = new byte[portion1];
    
                                     mmf_reader.ReadArray(0, buffer, 0, (int)portion1);
                                     mappedFiles.Add(new MappedFile
                                     {
                                         Offset =/* i **/ portion1, //fileOffset,  
                                        Buffer = buffer,
                                         FileSize = portion1
                                     });
                                 }
                             }
                             else if (i == 1)
                             {
                                 using (mmf_reader = mmf.CreateViewAccessor(portion1, portion2 - portion1, MemoryMappedFileAccess.Read))
                                 {
                                     buffer = new byte[portion2 - portion1];
    
                                     mmf_reader.ReadArray(0, buffer, 0, (int)(portion2 - portion1));
                                     mappedFiles.Add(new MappedFile
                                     {
                                         Offset = portion1 + portion2,// i * portionSize, //fileOffset,  
                                        Buffer = buffer,
                                         FileSize = portion2 - portion1
                                     });
                                 }
                             }
                             else if (i == 2)
                             {
                                 using (mmf_reader = mmf.CreateViewAccessor(portion2, portion3 - portion2, MemoryMappedFileAccess.Read))
                                 {
                                     buffer = new byte[portion3 - portion2];
    
                                     mmf_reader.ReadArray(0, buffer, 0, (int)(portion3 - portion2));
                                     mappedFiles.Add(new MappedFile
                                     {
                                         Offset = portion3 + portion2,// i * portionSize, //fileOffset,  
                                        Buffer = buffer,
                                         FileSize = portion3 - portion2
                                     });
                                 }
                             }
                             else if (i == 3)
                             {
                                 using (mmf_reader = mmf.CreateViewAccessor(portion2, portion3 - portion2, MemoryMappedFileAccess.Read))
                                 {
                                     buffer = new byte[portion3 - portion2];
    
                                     mmf_reader.ReadArray(0, buffer, 0, (int)(portion3 - portion2));
                                     mappedFiles.Add(new MappedFile
                                     {
                                         Offset = portion3 + portion2,// i * portionSize, //fileOffset,  
                                        Buffer = buffer,
                                         FileSize = portion3 - portion2
                                     });
                                 }
                             }
                             else if (i == 4)
                             {
                                 using (mmf_reader = mmf.CreateViewAccessor(portion3, portion4 - portion3, MemoryMappedFileAccess.Read))
                                 {
                                     buffer = new byte[portion4 - portion3];
    
                                     mmf_reader.ReadArray(0, buffer, 0, (int)(portion4 - portion3));
                                     mappedFiles.Add(new MappedFile
                                     {
                                         Offset = portion3 + portion2,// i * portionSize, //fileOffset,  
                                        Buffer = buffer,
                                         FileSize = portion4 - portion3
                                     });
                                 }
                             }
                             else if (i == 5)
                             {
                                 using (mmf_reader = mmf.CreateViewAccessor(portion4, portion5 - portion4, MemoryMappedFileAccess.Read))
                                 {
                                     buffer = new byte[portion5 - portion4];
    
                                     mmf_reader.ReadArray(0, buffer, 0, (int)(portion5 - portion4));
                                     mappedFiles.Add(new MappedFile
                                     {
                                         Offset = portion3 + portion2,// i * portionSize, //fileOffset,  
                                        Buffer = buffer,
                                         FileSize = portion5 - portion4
                                     });
                                 }
                             }
                        }

     以上尽管值加进去了,里边顺序还是变了并行线程用起来还是有些复杂度的,

    对以上

    mappedFiles 先初始化 ,
     mappedFiles = new List<MappedFile>();
                //初始化 list 六个
                for (int i = 0; i < 6; i++)
                {
                    MappedFile map = new MappedFile();
                    mappedFiles.Add(map);
    mappedFiles[0]=new MappedFile
    {
    // Offset =/* i **/ portion1, //fileOffset, 
    Buffer = buffer,
    // FileSize = portion1
    };  

    不用list.add的方式,直接赋值方式.问题解决

     
  • 相关阅读:
    Oracle使用笔记
    跳转至锚点
    项目中使用到的AOP
    短信验证码接口使用
    阿里人脸识别接口
    java实现网页截图
    java后台接收微信服务号/订阅号消息
    java 实现redis缓存
    redis 常用命令
    被骗了,自己还不知道
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/7365632.html
Copyright © 2011-2022 走看看