flshlion 2021-12-28 15:51 采纳率: 100%
浏览 53
已结题

delphi 多线程处理字符串不能并行的问题

用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不行,奇怪。

望赐教!感谢。

  • 写回答

2条回答 默认 最新

  • 墨梅无痕 2021-12-30 12:03
    关注

    这可能与内存管理有关。
    用System.StrMove,System.StrCopy试试,还有 System.MoveChars。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 已采纳回答 12月30日
  • 修改了问题 12月28日
  • 修改了问题 12月28日
  • 展开全部

悬赏问题

  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库