我试图在多线程管道中的矩阵上运行一些过滤器,以节省时间。可悲的是,出现了一些同步问题,但我尚未完全解决。
期望的是,我可以将矩阵输入到step()函数中,并接收一个上面具有所有过滤器的矩阵(由管道长度延迟)。
volatile private short[][] stage1matrix,stage2matrix;
public short[][] step(short[][] matrix) {
short[][] res = stage2matrix; // stage matrix with all applied filters for output
stage2matrix = stage1matrix; // take matrix with applied stage 1 filters for stage 2
stage1matrix = matrix; // stage input matrix for stage 1 filters
Thread stage2 = new Thread(() -> {
applyArtifactFilter(stage2matrix);
});
stage2.setPriority(10);
stage2.start();
Thread stage1 = new Thread(() -> {
applySaltFilter(stage1matrix);
applyLineFilter(stage1matrix);
applyMedFilter(stage1matrix);
applyPreArtifactFilter(stage1matrix);
});
stage1.start();
try {
stage1.join();
stage2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
return res; // output matrix with all applied filters
}
}
另外,对于一些其他(且可能是不必要的)信息,我正在以可恶的方式在applyMedFilter中使用并列(我并不认为这会导致问题,但是...):
ArrayList<Integer> rowIndices = new ArrayList<Integer>();
for (int i = kernel; i < matrix.length + kernel; i++) {
rowIndices.add(i);
}
// Move window through all elements of the image
rowIndices.parallelStream().forEach(i -> {
for (int j = kernel; j < matrix[0].length + kernel; j++) {
// do some rowwise independent work in parallel
doSomeThingWith(matrix[i][j]);
}
});
}
发生了什么事,我不定期地从仅应用了某些过滤器的函数中获取矩阵;尤其是有时候未应用applyMedFilter,这是不可能发生的。有时一切正常,有时不能正常运行的事实使我得出结论,这可能是缓存一致性问题。 另外,注释掉applyArtifactFilter似乎也可以解决问题。
为什么这不符合我的预期,我该如何做得更好?