2011-09-12 5 views
3

나는 코 루틴과 C를 계속하려고 노력 중입니다. 나는 스파게티 더미가 필요하다는 것을 깨달았습니다. 새로운 call-stack 내에서 함수를 실행할 수 있습니까? 물론 단일 스레드 내에서. 새롭고 분리 된 콜 스택을 만들고 그것에 대한 코드를 어떻게 수행 할 수 있습니까?C로 스파게티 스택 만드는 법?

답변

0

나는 여전히 연속성에 대해서는 확신하지 못하지만 적어도 coroutine에서는 C 내에서 이것을 수행 할 수있는 좋은 방법이 없다. 이것은 C 추상화를 벗어 났기 때문이다. setjmp/longjmp 범위가 C++/Objective-C 예외 시스템을 방해 할 수 있습니다. makecontext/swapcontext은 더 이상 사용되지 않습니다. 일부 시스템은 여전히 ​​기능을 지원하지만 적어도 Apple OS는 더 이상 지원하지 않습니다.

내게 유일한 해결책은 libtask library입니다. 아키텍처 고유의 어셈블리 코드를 사용하여 레지스터 상태를 저장 및 복원하고 호출 스택을 관리합니다. 모 놀리 틱 스택을 사용하고 있고 크기 제한이 있다고 생각합니다. 그러나 어쨌든, 신뢰할 수있는 작업을 찾을 수있는 유일한 솔루션입니다.

내 생각에 Clang's Segmented Stack (또는 GCC의 스플릿 스택) 기능은 C 레벨에서 매우 일반적인 코 루틴 지원을 가능하게합니다. 그리고 나중에 LLVM에 코 루틴 코드를 자유롭게 작성하려고합니다.

5

체크 아웃 makecontext/swapcontext.

이들을 사용할 수 없다면 setjmp/longjmp를 사용할 수 있지만 좀 더 복잡합니다.

2

Windows 사용자는 Fibers API을 볼 수 있습니다. Evil Otto의 대답은 이식성/POSIX 호환 성입니다.