到目前为止,我只编写了单核心程序。现在我想提高我的性能,并试图找出如何拉动和推送数据并行化。但我甚至不知道我是否对MultiThreading有正确的想法。
实际上这是一个非常简单的案例。我从外部接口提取数据,重新编写它们以使它们按正确的顺序排列并将它们推入OpenGL管道中以便绘制它们。
我使用 WPF应用程序作为GUI并使用SharpGL(OpenGL包装)呈现我的数据。该程序在双核处理器上运行。
这是我的愿景草图。
所以我的想法是使用bufferArray。现在的线索:我如何从不同的thrads中读取同一个数组?
我被建议通知 OpenMP 。但事实证明,对于.Net和C#来说,这不是一个好主意。
你能推荐一些贴纸吗?也许解释如何在这种情况下使用任务并行库(TPL)。
答案 0 :(得分:1)
对此的正确描述是生产者消费者模式。在.Net中,您可以使用TPL Dataflow
执行此操作可以使用BlockingCollection构建另一个实现。基本版本:
BlockingCollection<int> bc = new BlockingCollection<int>();
async Task Main()
{
// Fire up two readers
Task.Run(() => ReadCollection1());
Task.Run(() => ReadCollection2());
// Add items to process.
bc.Add(5);
bc.Add(6);
bc.Add(7);
bc.Add(8);
bc.Add(9);
bc.CompleteAdding(); // Signal we are finished adding items (on close of application for example)
}
void ReadCollection1()
{
foreach (var item in bc.GetConsumingEnumerable())
{
$"1 processed {item}".Dump();
}
}
void ReadCollection2()
{
foreach (var item in bc.GetConsumingEnumerable())
{
$"2 processed {item}".Dump();
}
}