- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
program Yields;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.Yield in 'System.Yield.pas';
procedure ShittyRec(Yield: TYield<Integer>; depth, par1, par2: integer);
var
i: integer;
begin
Yield(par1+par2);
if depth>100 then
exit;
for i := 0 to 99 do
begin
par2 := par2*65537+1;
ShittyRec(Yield, depth+1, par1*(i+1)+par2, par2);
end
end;
function GetNextShittyInt: TYieldEnumerable<Integer>;
begin
Result := TYieldEnumerable<Integer>.Create(
procedure(Yield: TYield<Integer>)
begin
Yield(0);
ShittyRec(Yield, 0, 1, 2);
end);
end;
var
i: Integer;
begin
for i in GetNextShittyInt do
begin
Writeln(i);
end;
Readln;
end.
Вообще мне правда порвали шаблон Fiberы, на которых это сделано. Корутины из времен WinNT3.51, с минимальным оверхедом на переключение потока (я правда его не тестил, но по описанию он меньше чем у обычных потоков т.к. планировщик в нем не участвует и даже TLS не надо переключать).
Т.е. хардкорный ассемблер, как в boost::coroutine?
http://www.boost.org/doc/libs/1_57_0/libs/context/doc/html/context/performance.html
Можно поподробнее (или даже ссылочку)?
http://www.netbsd.org/docs/kernel/lazyfpu.html
The FPU/MMX and SSE state could be saved and reloaded, but the CPU can also be tricked into generating an exception the first time that an FPU/MMX or SSE instruction is used by copying the hardware context switch mechanism (setting the TS flag in CR0).
http://wiki.osdev.org/Context_Switching
Я ленивый пиздюк.
А вот perl, ruby и местами JS так не думает
P.S. Но лучше для этого воткнуть какое-нибудь ожидание или блокирующую операцию. Эффект будет тот же, но тред не будут будить без повода.
Yield нужен разве что для мягкого busy wait'а (не будем обсуждать его нинужность):
а он нужен при реализации критических секций или при реализации локфри методов
Не особо, если честно. Внутри спинлока не ставят Yield (т.к. с тем же успехом можно сразу уйти в wait), а после неудачного спинлока будет уже wait.
> бизивейтах
Мы сейчас не о обычном бизивейте (аля спинлок), а о мягком, который я показал выше.
Капитан, улыбка сделала бы ваше лицо красивее. Хотя и морщинистее.
В монаду IO заверни или останови для сборки мусора.
Похоже твой смайлик демонстрирует нам лицо подопытного:
Паскаль трёт немного эбонитовую палочку, а потом вставляет подопотному свою елду.