gpt4 book ai didi

c# - 在 C# 中并发写入一个对象

转载 作者:太空狗 更新时间:2023-10-30 01:24:33 26 4
gpt4 key购买 nike

我正在用 C# 创建一个图像处理应用程序,并试图通过并行执行大量处理来利用我的多核系统。具体来说,我有一个 Parallel.For 循环遍历每个像素并应用高斯滤波器。只是执行计算,我看到了显着的加速,正如预期的那样,但是在尝试保存计算结果时出现了问题。代码看起来像这样:

Parallel.For(// various loop parameters
{
// processing and number crunching
// significant speed up here
.
.
.
bitmap.SetPixel(x, y, value);
});

这会导致运行时错误,因为多个线程最终会同时尝试写入位图对象。我锁定对象如下:

lock(bitmap)
bitmap.SetPixel(x, y, value);

但这最终比串行版本慢。检查后发现,每次循环迭代调用 SetPixel 大约需要 90% 的运行时间,这意味着单独的线程花费了大量时间等待获取位图对象的锁,并且增加了开销有多个线程会减慢速度。

那么我想知道的是,有没有办法让多个线程同时写入同一个对象?我很小心每个线程都在图像的不同部分工作,因此不会引入竞争条件。有什么方法可以覆盖抛出的错误并说,“我知道我在做什么是不安全的,但我还是想这样做?”像 Concurrency::combinable 类这样的东西似乎可以解决问题,但那只是在 C++ 中。

最佳答案

如果您在整个图像中进行过滤,您应该考虑 locking位图,将图像数据复制到一个数组,然后同时更新数组数据,而不是调用 SetPixel

关于c# - 在 C# 中并发写入一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com