
Как выглядит:
класс TThread получил метод Fork: boolean, который надо вызвать в требующем синхронизации методе:
TMyThread.MainThreadMethod(ParamList): AnyType;
begin
if Fork then exit;
.....
end;
Fork проверяет, в каком потоке он выполняется, и возвращает false, если это MainThread. В противном случае fork выполняет переключение в MainThread, копирует параметры из стека потока в стек MainThread и повторно вызывает этот же метод. Затем возвращает true.
Вызов получается абсолютно корректным как с точки зрения reference count, так и с точки зрения обработки exceptions. Всё, чего не хватает при реализации на Delphi: метод не должен быть register (все параметры нужны в стеке) и, находясь в Fork, невозможно определить точку входа в обрамляющий метод - приходится передавать её как параметр:
if Fork(@TMyThread.MainThreadMethod) then exit;
Компилятору это, естественно, не проблема. B)