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

悬赏问题

  • ¥15 如何通过交互分析得出某高危患者对放疗获益更多
  • ¥15 相关性分析中,p<0.05, r=0.29,怎么评价相关性呢
  • ¥15 docker部署Mongodb后输入命令报错?
  • ¥15 将下列流程图转变成python程序代码
  • ¥15 我需要全国每个城市的最新小区名字等数据。
  • ¥15 开发一个小区生态的小程序
  • ¥15 如何解决Excel中dependent dropdown list 的问题
  • ¥15 MddBootstrapInitialize2失败
  • ¥15 LCD Flicker
  • ¥15 esp32在micropython环境下使用ssl/tls连接mqtt服务器出现以下报错Connected on 192.168.154.223发生意外错误: 5无法连接到 MQTT 代理,如何解决?