2

C/C++ では、コルーチンはスタック交換ハックで実装されるため、スタック サイズは通常制限され、自動的に大きくなりません。

Dファイバーにはこれらの制限がありますか? それとも自動的に成長しますか?

4

1 に答える 1

1

4K の初期ファイバー サイズで試してみましたが、最初のスタックが 4K を超えると D ファイバーがクラッシュしました。とにかく、一度譲った後、サブルーチンで8Kを超えるスタック配列変数を保持しました。そのため、収量が発生するたびにスタックが成長するようです。したがって、単に安全というわけではありません。プログラマーはスタック サイズに注意する必要があります。

さらに、Dprintfはスタックのサイズに関係なくクラッシュしました... 理由はわかりません... これが私のテスト コードです。

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
于 2013-11-09T04:38:53.590 に答える