C#疑难杂症:增加线程,无法提高程序执行性能,但是增加进程可以;线程执行未加锁,附代码

  • 1进程100线程,占用CPU 20%多;(如果开4个进程,则CPU占用可以增加到90%左右;证明进程之间是互不干扰的)
  • 1进程400线程,占用CPU还是20%;CPU占用应该增加4倍才对啊?(线程之间未加锁)

被这个问题困扰了好久,为什么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占用。

多进程不存在同步的问题,所以可以并行。

以上是 C#疑难杂症:增加线程,无法提高程序执行性能,但是增加进程可以;线程执行未加锁,附代码 的全部内容, 来源链接: utcz.com/a/39415.html

回到顶部