被这个问题困扰了好久,为什么1个进程400线程CPU不能占用到90%左右?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Question_CsharpSplit
{
class Program
{
static void Main(string[] args) {
//产生一字符串,大小1MB
StringBuilder tStr = new StringBuilder();
while (tStr.Length < 1024 * 1024 * 1) {
tStr.Append(DateTime.Now.Ticks.ToString() + "|");
}
//多线程执行
long countTemp = 0;
DateTime dtStart = DateTime.Now;
Thread[] tdTemp = new Thread[100];
for (int i = 0; i < tdTemp.Length; i++) {
tdTemp[i] = new Thread(new ThreadStart(() => {
while (true) {
countTemp++;
//【问题:为什么这里多线程占不满CPU?而多进程可以?】
string t = tStr.ToString();
string[] arrTemp = t.Split('|');
}
}));
tdTemp[i].Start();
}
//显示速度
while (true) {
Console.WriteLine((1.0 * countTemp / (DateTime.Now - dtStart).TotalSeconds) + "/s");
Thread.Sleep(1000);
}
}
}
}
你的线程调用,主要的代码是
string t = tStr.ToString();
string[] arrTemp = t.Split('|');
这两个函数作为线程安全的函数,内部存在同步,所以可能并不能并行执行。
你可以看下任务管理器的cpu占用。
多进程不存在同步的问题,所以可以并行。
"为什么1个进程400线程CPU不能占用到90%左右",我对这方面不熟悉,但是我觉得cpu占用率不能简单的按线程的数量简单的等比例计算,还要考虑其他因素
https://stackoverflow.com/questions/12892941/cpu-usage-vs-number-of-threads
对呀 为什么会这样 很奇怪