我正在尝试将现有的单线程泛洪填充算法转换为多线程填充算法。
输入: - 2d位阵列及其暗淡 - 应该开始填充的xy coords
输出: - 具有更新位的相同2d位阵列
问题: - 当时只有1个线程可以写入数组中给定的64位(8x8像素),也没有其他线程可以在写入时读取这个64位块
我已经开始使用队列方法和线程池,所以一旦线程完成它的工作,就可以从队列中接受另一个任务。
您如何组织符合'问题'声明的线程同步?
主要问题是如何将读/写锁定器分配给给定的内存块?
答案 0 :(得分:2)
通常,您希望尽可能粗略地划分数据,并最大限度地减少线程之间的通信。通信包括共享数据结构,甚至是无锁数据结构。特别是存在具有写访问权限的共享变量的那些。
以上一般“粗略”政策避免了阻止扩展的常见陷阱(例如false sharing)。
至于你的具体问题,我不得不承认,我不熟悉洪水填充算法,所以我不能立即勾勒出粗略的方法。
然而,如果粗略的方法不可行并且需要一种锁定单个细胞的策略,lock striping可能是一种值得在这种情况下进行调查的方法。
无锁实现是另一种可能性。如果另一个线程在相同的8x8像素64位块中写入,可能使用比较和交换类型操作来执行写入(VS上的InterlockedCompareExchange64)和重试逻辑。
可以完全放松读锁定。如果2个线程最终绘制相同的像素,它可能只会浪费一些周期,但不会破坏结果。
无锁实施could be several times faster。
如果您使用的是Java Java Concurrency in Practice by Goetz,那么关于锁定条带化的内容是一本很好的书。