В C/C++ сопрограммы реализованы с помощью взлома стека, поэтому размер стека обычно ограничен, не растет автоматически.Имеет ли D-волокно ограничение размера стека?
Имеет ли D-волокно эти ограничения? Или он растет автоматически?
В C/C++ сопрограммы реализованы с помощью взлома стека, поэтому размер стека обычно ограничен, не растет автоматически.Имеет ли D-волокно ограничение размера стека?
Имеет ли D-волокно эти ограничения? Или он растет автоматически?
Я попробовал с начальным размером волокна 4K, и D Fiber разбился, если первый стек переполнен 4K. Во всяком случае, после того, как он уступил, в подпрограммах он хранит переменную типа массива 8K. Таким образом, кажется, что растет стек за каждый выход. Так что это не просто безопасно, программист должен заботиться о размере стека.
В дополнение к, D разбился на любые printf
независимо от размера стека ... Не знаю, почему ... Вот мой тестовый код.
import std.stdio;
import std.concurrency;
import core.thread;
import std.container;
import std.conv;
void main()
{
Fiber[] fs = new Fiber[10];
foreach (int i; 0..cast(int)fs.length)
{
fs[i] = new F1(i);
};
foreach (ref Fiber f ; fs)
{
f.call();
};
foreach (ref Fiber f ; fs)
{
f.call();
};
foreach (ref Fiber f ; fs)
{
auto s = f.state;
writeln(s);
};
}
class F1 : Fiber
{
this(int idx)
{
super(&run, 4096);
_idx = idx;
}
private:
int _idx;
void run()
{
byte[3700] test1;
//byte[1024] test2;
writeln(_idx);
//t1();
this.yield();
t1();
//byte[1024] test3;
//byte[1024] test4;
writeln(_idx);
}
void t1()
{
byte[4096] test;
//printf("T1!");
t2();
}
void t2()
{
byte[2048] test;
//printf("T2!");
//t3();
}
void t3()
{
byte[2048] test;
printf("T3!");
}
}
Текущий результат.
0
1
2
3
4
5
6
7
8
9
0
./build.bash: line 11: 26460 Segmentation fault: 11 ./tester
Я никогда не использовал D, но просто чтение вручную показывает [конструктор] (http://dlang.org/phobos/core_thread.html#.Fiber) принимает параметр 'size_t sz', который * размер стека для этого волокна *. Так создайте волокно с искусственно маленьким размером стека и попытайтесь взорвать его. –
@ ta.speot.is OK Я попробую. – Eonil