用Delphi写了一个程序,尝试用2条以上线程并行计算以提高速度,发现真正运行时基本上是串行,只使用CPU一个核心。排查了很久,全局变量,VCL访问全部排除,最后发现是字符串处理函数(Midstr)的问题,再深入尝试发现是COPY函数的问题。
做了一个简例,代码如下:
procedure incedit1; // 线程 1
var
s: string;
begin
while True do
begin
s := copy('tretryjtrry', 1, 5);
end;
end;
procedure incedit2; // 线程 2
var
s: string;
begin
while True do
begin
s := copy('hjkghjgjhrry', 2, 6);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
th1,th2: cardinal; // 卡迪纳尔 无符号整型
h1,h2: integer; // ZN 质数数量 K 基准测试判断
begin
h1 := beginthread(nil, 1024, @incedit1, nil, 0, th1);
h2 := beginthread(nil, 1024, @incedit2, nil, 0, th2);
end;
只要两条线程都用了COPY函数,运行时CPU就只用到1个核心,只要将其中一线程内容去除Copy,就能两条线程同时运行,利用到两个核心。
请问有没有办法充分利用CPU? 试过用Byte Array代替String处理,一样的只能使用一个核心。
刚刚用Lazarus与VB.NET试了一下,没有任何问题,反而Delphi不行,奇怪。
望赐教!感谢。