基本上我正在研究这种节拍检测算法,我现在遇到的奇怪的事情就是当我将工作量分配到另一个线程时。所以现在我有一个主线程和另一个工作线程。我的工作线程总是以比主线程更快的速度工作。这看起来很奇怪,因为我学到的是主线程理论上应该总是更快,因为它没有花时间来初始化线程。然而,我得到的是,即使我将额外的1024个样本传递给工作线程(它们目前都在使用大约3000万个样本),它仍然比主线程更快。是因为我在主线程上运行了应用程序吗?我现在真的很困惑。这是代码
UnityEngine.Debug.Log ("T800 Start");
Step3 s1= new Step3();
Step3WOMT s2= new Step3WOMT();
System.Object tempObj= samples2 as System.Object;
float[] tempArray = new float[eS.Length/ 2];
System.Threading.ParameterizedThreadStart parameterizedts = new System.Threading.ParameterizedThreadStart(s1.DoStep3);
System.Threading.Thread T1 = new System.Threading.Thread(parameterizedts);
T1.Start (tempObj);
s2.DoStep3(samples1);
UnityEngine.Debug.Log ("s2");
//UnityEngine.Debug.Log (stopwatch.ElapsedMilliseconds);
T1.Join();
不用担心我只在多线程中使用c#功能,所以我相信它应该没问题。我真的很困惑的是,如果我注释掉T1.join();把整个事情排成一线甚至更慢。我现在真的很困惑,因为这个问题似乎没有合理的答案。
答案 0 :(得分:1)
T1.join()完成所有魔法。它允许主线程等待所有工作线程完成。这有必要吗?取决于你的应用程序。期望主线程等待其工作线程的执行结束。
答案 1 :(得分:0)
Thread.Start
可能不会立即返回。无论如何,您应该使用ThreadPool.EnqueueUserWorkItem
和ManualResetEvent
等待而不是加入。ThreadPool
通常不必初始化新线程,但仍需要一些时间来启动代码。我认为你不应该使用多线程来处理< ~50ms。