将字符串复制到工作线程

4
我有一个应用程序,主线程(UI 线程)和工作线程。

主线程将一个大字符串传递给工作线程,工作线程根据传递的字符串进行一些工作。

在工作线程执行期间,传递字符串的内容可能会发生更改。

有没有办法复制字符串(例如,在工作线程的构造函数中),以避免可能出现的意外,并在该字符串副本上进行操作?

copy() 或 UniqueString() 是否能达到这个目的?


1
正如@gabr所写:通常情况下是没有必要的,除非您使用指针(PChar等)修改字符串。而且,UniqueString或Copy将确保您获得唯一的副本。 - Rudy Velthuis
1个回答

8

不需要调用任何东西。Delphi中最常用的字符串(string,AnsiString和UnicodeString)实现了“写时复制”机制。如果一个线程修改了共享字符串,线程将自动创建该字符串的新副本,并修改该副本。

如果您仍然想要一个不被代码的其他部分“拥有”的字符串,可以调用UniqueString(s)。


4
请注意,COW 只能在使用 RTL 函数对字符串类型进行修改时起作用(例如 Insert()Delete()[] 运算符等)。如果您通过 P(Ansi|Wide)Char 指针直接修改字符串的字符,则所有规则均无效,并且除非您事先显式调用 UniqueString(),否则 COW 会出错。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接