Многопоточность в Go выглядит примерно так:
- Код: Выделить всё
procedure Test();
var i: Integer;
begin
for i := 1 to 100 do writeln('test' + IntToStr(i));
writeln('ok');
end;
go Test();
writeln('done');
в результате получится примерно так:
test1
done
test2
...
ok
А для синхранизации и получения результата есть так называемые каналы. Допустим, что readln() может принимать то, что отправлено в паралельном writeln().
- Код: Выделить всё
go Test();
while readln() <> 'ok' do sleep();
writeln('done');
Получится такое:
test1
test2
..
ok
done
Добавлено спустя 10 минут 14 секунд:Что касается недостатков. Си (как и Паскаль) суров и не умеет самостоятельно определять, какие переменные и функции будут использоваться из разных потоков и каким образом будут использоваться. Для этого нужны:
- модификаторы для запрета изменения или создания копии при изменении (у Паскаля такое по умолчанию для параметров функций)
- модификаторы для атомарного доступа к переменной, то есть автоматического помещения переменной в "кабинку", в которую зайти может только один поток, и пока он не выйдет, другие будут ждать.