2013-11-09 2 views
2

В C/C++ сопрограммы реализованы с помощью взлома стека, поэтому размер стека обычно ограничен, не растет автоматически.Имеет ли D-волокно ограничение размера стека?

Имеет ли D-волокно эти ограничения? Или он растет автоматически?

+0

Я никогда не использовал D, но просто чтение вручную показывает [конструктор] (http://dlang.org/phobos/core_thread.html#.Fiber) принимает параметр 'size_t sz', который * размер стека для этого волокна *. Так создайте волокно с искусственно маленьким размером стека и попытайтесь взорвать его. –

+0

@ ta.speot.is OK Я попробую. – Eonil

ответ

1

Я попробовал с начальным размером волокна 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