Parallel.Foreach如何在不同的线程中创建局部变量

时间:2015-04-10 08:41:12

标签: c# multithreading parallel-processing task parallel.foreach

 Parallel.ForEach(array_ptr, 
                new ParallelOptions { MaxDegreeOfParallelism = 2 },                     
                (current_ptr, state, index) => after_di(current_ptr)    
            );

功能after_di:

private IntPtr after_di(IntPtr in_ptr)
    {
        IntPtr det_ptr = det(in_ptr);
        free_image_pointer(in_ptr);
        IntPtr adp_ptr = adaptive_scaler(det_ptr, 1280, 720, 1, 1, 70);
        free_image_pointer(det_ptr);
        IntPtr cmu_ptr = cmu(adp_ptr, 1, 1, 1, 1, 1, 1, 1, 1);
        free_image_pointer(adp_ptr);
        return cmu_ptr;
    }

问题是当Parallel在同一个线程中运行时,free_image_pointer函数(在dll C代码中自由分配内存)不会释放右指针,因此会导致错误。我希望每个项目循环中的每个IntPtr det_ptr,IntPtr adp_ptr,IntPtr cmu_ptr都不同。有可能吗?

更新测试 在调试时,我看到只有det()函数才会出现问题。所以我只用det()函数做了一些测试。在我的主要功能中,这就是我所做的:

  IntPtr main_out0_ptr = det(temp_rgb0);
  IntPtr main_out1_ptr = det(temp_rgb1);

上面的代码很好。但是,如果我在每个功能上创建新线程:

Thread th1 = new Thread(() =>  det(temp_rgb0));
th1.Start();
Thread th2 = new Thread(() => det(temp_rgb1));
th2.Start();

发生错误,它说:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

我仍然不知道为什么会这样。

1 个答案:

答案 0 :(得分:0)

如果不查看det(),adaptive_scaler()的实现,很难建议......但是ThreadLocal<T>是针对这样的场景设计的(每个线程都需要有一个值的本地副本。

以下是MSDN link,并且有一个代码示例演示了它是如何工作的。