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

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日
  • 展开全部

悬赏问题

  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码