繁体   English   中英

C#multithreading奇怪的行为

[英]C# multithreading Strange behaviour

基本上我正在研究这种节拍检测算法,我现在遇到的奇怪的事情就是当我将工作量分配到另一个线程时。 所以现在我有一个主线程和另一个工作线程。 我的工作线程总是以比主线程更快的速度工作。 这看起来很奇怪,因为我学到的是主线程理论上应该总是更快,因为它没有花时间来初始化线程。 然而,我得到的是,即使我将额外的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(); 把整个事情排成一线甚至更慢。 我现在真的很困惑,因为这个问题似乎没有合理的答案。

T1.join()完成了所有的魔法。 它允许主线程等待所有工作线程完成。 这有必要吗? 取决于你的应用程序。 期望主线程等待其工作线程的执行结束。

  1. 您的系统必须具有多个核心。
  2. 线程初始化后, Thread.Start可能不会立即返回。 无论如何,你应该使用ThreadPool.EnqueueUserWorkItemManualResetEvent来等待而不是加入。
  3. 要查看实际结果,您的样本数必须足够大,以便与代码的执行时间相比,线程初始化时间最短。 ThreadPool通常不必初始化新线程,但仍需要一些时间来启动代码。 我认为你不应该使用多线程来完成<~50ms的任务。
  4. 如果比较大样本计数的执行时间(需要几秒钟),您将看到主线程和后台线程的性能没有差异(除非主线程具有更高的优先级)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM