多线程的多核分配问题验证
生活随笔
收集整理的這篇文章主要介紹了
多线程的多核分配问题验证
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
using System.Diagnostics;
using System;
using System.Threading.Tasks;namespace THREADS
{class Threads{public double[] times = new double[4];public int[] counts = new int[] { 40000000, 50000000, 70000000 };/**** 測試驗證* 1,當一個進程有多個線程時,操作系統會自動將線程分配到不同的CPU上,最優化分配*/public void Start(){var sw = new Stopwatch();var tasks = new Task[4];/**** Step1,創建四個線程,(使用 new Thread是等效的)*///測試1,三個線程,每個線程跑一個任務tasks[0] = new Task(() => {DoTask(counts[0]);times[0] = sw.ElapsedMilliseconds;});tasks[1] = new Task(() => {DoTask(counts[1]);times[1] = sw.ElapsedMilliseconds;});tasks[2] = new Task(() => {DoTask(counts[2]);times[2] = sw.ElapsedMilliseconds;});//測試2,一個線程跑三個任務tasks[3] = new Task(() => {DoTask(counts[0]);DoTask(counts[1]);DoTask(counts[2]);times[3] = sw.ElapsedMilliseconds;});/**** Step2,開啟測試線程*///PrintProcessInfo("測試線程開啟前"); 開啟會使t4時間反而變短了,原因不明//BindThreadToCpu(0); 在此位置綁定是無效的,因為我們的測試線程還沒開啟,無法將它們都綁定到某個核上sw.Start();tasks[0].Start();tasks[1].Start();tasks[2].Start();tasks[3].Start();/**** Step3,綁定所有線程到某個核上* 可以發現,綁定后所有線程的運算時間都明顯加長了,因為它們共用一個CPU(debug模式效果更明顯,release模式在數據量小時不明顯)*/long bindtime = 0;if (true){var tsw = Stopwatch.StartNew();var t0 = tsw.ElapsedMilliseconds;BindThreadToCpu(0); //在此位置綁定是有效的,因為我們的測試線程已經開啟,可以將它們都綁定到某個核上bindtime = tsw.ElapsedMilliseconds - t0;}/**** Step4,等待所有線程結束打印運行時間*///PrintProcessInfo("測試線程開啟后");Task.WaitAll(tasks);Console.WriteLine($"time1:{times[0]}, time2:{times[1]}, time3:{times[2]}, time4:{times[3]}, bindtime:{bindtime}");}private void DoTask(int n){double sum = 9999999999;for (int i = 0; i < n; i++){sum /= (i + 1)*(i+1);}}private void PrintProcessInfo(string info){var p = Process.GetCurrentProcess();var threads = p.Threads;Console.WriteLine($"{info}:當前進程共有{threads.Count}個線程");}private void BindThreadToCpu(int core){var p = Process.GetCurrentProcess();var threads = p.Threads;if (core >= 0){for (int i = 0; i < threads.Count; i++){var item = threads[i];//將線程綁定到某個核上item.ProcessorAffinity = (IntPtr)(core + 1);item.IdealProcessor = core;}}}}class Program{static void Main(string[] args){new Threads().Start();Console.WriteLine($"執行完成,按任意鍵結束");Console.Read();}}
}
總結
以上是生活随笔為你收集整理的多线程的多核分配问题验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++C#联合调试
- 下一篇: 子线程适当Sleep的重要性