2017-09-18 13 views
3

私はどのようにブーストコルーチンでセグメント化されたスタックを使用できるかの例を教えていただけますか?コルーチンから呼び出されるすべての関数に特殊なsplit-stack属性を付ける必要がありますか?Boost.Coroutineはセグメント化されたスタックを使用していません

セグメント化されたスタックを使用する必要があるプログラムを作成しようとすると、segfaultsになります。ここで


は は、コードがセグメント化スタックが使用された場合、私はより多くの反復を処理できることを期待する、非常に迅速にセグメンテーションフォールトているようだhttps://wandbox.org/permlink/TltQwGpy4hRoHgDYこれまでのところ、私がやっていることです。 35回の反復後にプログラムのエラーが発生します。

#include <boost/coroutine2/all.hpp> 

#include <iostream> 
#include <array> 

using std::cout; 
using std::endl; 

class Int { 
    int a{2}; 
}; 

void foo(int num) { 
    cout << "In iteration " << num << endl; 
    std::array<Int, 1000> arr; 
    static_cast<void>(arr); 
    foo(num + 1); 
} 

int main() { 
    using Coroutine_t = boost::coroutines2::coroutine<int>::push_type; 
    auto coro = Coroutine_t{[&](auto& yield) { 
     foo(yield.get()); 
    }}; 

    coro(0); 
} 
+0

ブーストコルーチンでセグメント化されたスタックを使用することのいくつかの面で問題がありますか、それともまだ試みようとしていませんか? – TylerH

+0

@TylerHスタックオーバーフローが発生したときに発生しますが、セグメント化されたスタックを使用する方法がわかりません。ここのドキュメントを読むことからhttps://llvm.org/docs/SegmentedStacks.html機能のように特別な注釈が必要になります。他の人がこれをどのように達成したかの例がほしいと思っています – Curious

+4

私は、 C++に精通していますが、あなたが他の実装を探しているのであれば、恐れがあります。この質問は、主に意見ベースにすぎません(例えば、 "あなたはどうやって?")。特定の問題/デモコードを実装の試行で表示するために質問を言い換えることができれば、直面している問題の解決に役立つ回答を提供する方が簡単です。 – TylerH

答えて

3

-fsplit-stackでコードをコンパイルすると問題が解決します。注釈は必要ありません。すべての関数は、デフォルトで分割スタックとして扱われます。例 - https://wandbox.org/permlink/Pzzj5gMoUAyU0h7Q

簡単です。

0

b2プロパティsegmented-stacks = on(boost.coroutineとboost.context内の特別なコードを有効にする)でboost(boost.contextとboost.coroutine)をコンパイルします。

あなたのアプリは-DBOOST_USE_SEGMENTED_STACKS-fsplit-stack(boost.coroutinesヘッダーで必要です)でコンパイルする必要があります。

は、マニュアルを参照してください:http://www.boost.org/doc/libs/1_65_1/libs/coroutine/doc/html/coroutine/stack/segmented_stack_allocator.html

boost.coroutineは、セグメント化されたスタック (ディレクトリ内コルーチン/例/非対称/コールb2 toolset=gcc segmented-stacks=on)を示す例が含まれています。

注意:llvmはセグメント化されたスタックをサポートしていますが、clangの継ぎ目は__splitstack_<xyz>の機能を提供しません。

関連する問題