0

我是编程的初学者,我想知道同步线程。

我有一个 WinForms 程序,它需要为每个 cpu 内核创建线程并运行一个方法指定的次数。

我在嵌套循环中设置并运行了线程,但我的输出如下:

thread: 0, run: 1, time: xxx
thread: 1, run: 1, time: xxx
thread: 2, run: 1, time: xxx
thread: 3, run: 1, time: xxx
thread: 1, run: 2, time: xxx
thread: 2, run: 2, time: xxx

等但是我希望输出显示数据,如下所示:

thread: 0, run: 1, time: xxx
thread: 0, run: 2, time: xxx
thread: 0, run: 3, time: xxx
thread: 1, run: 1, time: xxx
thread: 1, run: 2, time: xxx
thread: 1, run: 3, time: xxx

等等

在我的表单中,我创建线程并从一个单独的类中调用一个方法,就像这样;

SomeClass[] thisArray = new SomeClass[numThreads];

for (int runNumber = 1; runNumber <= numberOfRuns; runNumber++)
    {
        for (int i = 0; i < numThreads; i++)
        {
            thisArray[i].mThread = new Thread(thisArray[i].StartMethod);
            thisArray[i].mThread.Start();
            thisArray[i].mThread.Join();


           //Display thread id and number of runs
           this.tBoxW.AppendText(string.Format("") + Environment.NewLine);
           this.tBoxW.AppendText(string.Format("Thread Id: ") + i.ToString() + 
           Environment.NewLine);

           this.tBoxW.AppendText(string.Format("Number of Runs {0}", numberOfRuns) + 
           Environment.NewLine);

        }
}

SomeClass 位于 SomeClass.cs 中,并提供了 StartMethod() 方法,该方法通过一系列方程运行。

为了以我想要的方式获得输出,我是否正确地假设我需要同步线程?或者也许有更简单的方法?

当我刚开始使用线程时,我正在寻找实现所需输出的最简单方法。

任何帮助将不胜感激。感谢您花时间看我的问题。

4

1 回答 1

0

我不清楚你想要什么。您必须告诉我们更多您的问题需要什么同步。线程任务如何相互依赖?如果它们依赖,您必须同步。最后,无论如何您都必须同步。

由于它是 WinForms,我不确定它是否可能(是否绑定到较旧的 .NET 版本),但请尝试使用较新的 Task API。然后你可以 WaitAny()。或者,如果您可以将问题转换为并行循环,那就更好了。

另外,您在谈论CPU内核。您将无法将线程显式分配给某些 CPU 内核(也许 99% 的情况下甚至不建议这样做)。线程池会处理这个问题。如果您需要关闭所有 CPU 资源,您可能希望生成比 CPU 更多的线程。

于 2013-04-16T23:09:21.633 回答