2016-09-05 11 views
3

저는 LLVM으로 컴파일 될 작은 C++ 같은 언어로 작업하고 있습니다. 내가 구현하고자하는 일 중 하나는 협력적인 멀티 태스킹이다. 스택 포인터와 프로그램 카운터를 내 프로그램의 다음 "스레드"로 바꿀 수있는 "yield"연산자가있을 것입니다.스택 포인터를 LLVM에 설정할 수 있습니까?

llvm에서이 작업을 수행 할 수 있습니까? 스택 포인터 레지스터를 설정할 수 있습니까? 그렇지 않다면 내가 할 수있는 비슷한 것이 있습니까?

편집 : LLVM coroutines (http://llvm.org/docs/Coroutines.html)는 유망한 것으로 생각되지만, https://internals.rust-lang.org/t/llvm-coroutines-to-bring-awarness/3708/12은 stackful 또는 stackless coroutines에 관한 몇 가지 질문을 제기합니다. 일반적인 yield-like 연산자를 구현하는 데 사용할 수 있습니까?

편집 2 : C++ 부스트에는 스택 콜 루틴을 구현할 수있는 "컨텍스트"라는 것이 있습니다. 아직도 그들이 그것을 어떻게하는지 계산하려고 노력하고 있습니다. 누구 알아?

답변

0

gcd 라이브러리가 있다고 가정하면 : 세마포어 (dispatch_semaphore_t)를 사용하여 협업 멀티 태스킹을 쉽게 구현할 수 있습니다. 세마포어 카운트는 정확히 하나의 스레드가 동시에 실행될 수 있도록 설정됩니다. yield() 함수는 시그널을 즉시 보내 시그널을 잠급니다. signal()은 다른 쓰레드를 깨우고, 자물쇠는 yield를 호출 한 쓰레드를 멈 춥니 다.

+0

재미 있습니다! 이것은 마치 사과 만있는 것처럼 보입니다. 또한, 이것은 스택 포인터를 교환하는 것만큼 빠르지 않습니까? 아니면 커널을 통과하는 것과 같이 느린 일을합니까? – Verdagon