嗨在我的多线程应用程序中,一些线程(和MainThread,ofcourse)正在访问全局字符串变量。其他线程只读取值,但主线程可以更改它们。可能是,我仍然需要使用Synchronize?
先生。大卫,会告诉你什么?
var
maillist:tstringlist;
mindex:integer; // global variables.
procedure TMultiThread.Execute;
begin
while true do
begin
if (icount>=0) or (terminated) then
exit;
try
sec.enter; // critical section
login := maillist.names[mIndex];
UniqueString(login);
password:=maillist.ValueFromIndex[mIndex];
UniqueString(password);
interlockedincrement(mindex);
finally
sec.leave;
end;
if terminated then exit;
if (login=emptystr) or (password=emptystr) then
continue;
答案 0 :(得分:1)
对于像字符串这样的复杂对象,为避免竞争条件下的数据损坏,您需要使用同步对象同步访问。例如:
TCriticalSection
。 TMonitor
。 TMultiReadExclusiveWriteSynchronizer
。 除了同步以避免数据损坏之外,您可能还需要同步语义正确性。这一切都取决于数据的使用方式。
作为一般规则,尽可能避免共享数据以避免同步。过度同步会影响可扩展性。
这个答案(https://stackoverflow.com/a/19703381/505088)展示了如何创建一个通用的线程安全类,在本例中使用了一个临界区。您可以通过进行最小的更改,将该想法与上述任何同步对象一起使用。