2017-04-26 5 views
2

부스트 coroutines2 라이브러리를 사용하는 방법을 배우고 있습니다. 나는 튜토리얼을 읽고 그것을 실험하기 시작했다. 그러나 그 때 나는 아주 혼란스러운 것을 발견했습니다. 이 기본 예제를 살펴보십시오. 나는 '소스'의 주요 기능에 호출을 제거 할 때, 놀랍게도, 결과는 그냥 같은 Coroutines2 - 소스가 없을 때 yield가 실행되는 이유

First time. 
Second time. 

입니다

:

#include <boost/coroutine2/all.hpp> 
#include <iostream> 

using namespace std; 
typedef boost::coroutines2::coroutine<int> cr; 

void creator(cr::push_type& yield) 
{ 
    cout << "First time." << endl; 
    yield(1); 
    cout << "Second time. " << endl; 
    yield(2); 
} 

int main() 
{ 
    cr::pull_type source{creator}; 
    source(); 
} 

결과는 자연적으로,이입니다! (! 자습서에 따르면, 코 루틴 건축시 처음이라고, 그래서 그것을 호출 할 때 괜찮습니다,하지만 지금은 한 번만 호출해야합니다)

#include <boost/coroutine2/all.hpp> 
#include <iostream> 

using namespace std; 
typedef boost::coroutines2::coroutine<int> cr; 

void creator(cr::push_type& yield) 
{ 
    cout << "First time." << endl; 
    yield(1); 
    cout << "Second time. " << endl; 
    yield(2); 
} 

int main() 
{ 
    cr::pull_type source{creator}; 
} 

결과는 여전히 :

First time. 
Second time. 
I는 코 루틴에서 두번째 "수율"제거하면

이 결과는 동일하다 :

#include <boost/coroutine2/all.hpp> 
#include <iostream> 

using namespace std; 
typedef boost::coroutines2::coroutine<int> cr; 

void creator(cr::push_type& yield) 
{ 
    cout << "First time." << endl; 
    yield(1); 
    cout << "Second time. " << endl; 
} 

int main() 
{ 
    cr::pull_type source{creator}; 
} 

결과 :

어떻게 가능합니까? 어떻게 작동합니까? 나는 코 루틴을 호출하지 않을 때 기다리는 또 다른 '수익률'이 있더라도 아무것도 일어나지 않을 것이라고 예상했다.

그리고 나는이 행동이 이상한 찾을 : 나는 주에 또 다른 '소스'문을 추가 할 때

, 그래도 코드가 시작되는 시점과 동일한 인쇄!

#include <boost/coroutine2/all.hpp> 
#include <iostream> 

using namespace std; 
typedef boost::coroutines2::coroutine<int> cr; 

void creator(cr::push_type& yield) 
{ 
    cout << "First time." << endl; 
    yield(1); 
    cout << "Second time. " << endl; 
    yield(2); 
} 

int main() 
{ 
    cr::pull_type source{creator}; 
    source(); 
    source(); 
} 

결과 : '수율의가

First time. 
Second time. 

오류 없음 더 많은 시간을 소싱하는 경우에도보다. 만 내가 런타임 오류가 발생 할 주요 기능에 또 하나의 '소스'를 추가 한 후

int main() 
{ 
    cr::pull_type source{creator}; 
    source(); 
    source(); 
    source(); 
} 

누군가가 나를 도와 줘요 수 (이 응용 프로그램은 ... 비정상적인 방식으로 종료 할 런타임을 요청했습니다) 이 행동을 이해하고 있습니까?

+0

또한 Boost 버전과 관련이 있습니다. 나는 완드 박스 온라인 컴파일러를 사용하여 쉽게 부스트 버전을 선택했으며, 예를 들어 Boost 1.59.0에서는 FINE으로 작동합니다. Boost 1.60.0에서는 Boost 1.61.0 및 1.62.0에서 컴파일이 중단되는 반면 잘 동작합니다. 그런 다음 OK를 컴파일하지만 Boost 1.63.0에서 작동하지 않습니다. 무슨 학살인가. – YotKay

+0

그리고 부스트 1.64.0에서 결과는 1.63.0과 동일합니다. 즉, 컴파일은 좋지만 직관적이지는 않습니다. 아니면 여기서 뭔가를 이해하지 못했을까요? 도와주세요! – YotKay

+0

1.63 버전에서 1.59 버전의 버그를 수정했는지 아니면 하나를 만든 것인지 궁금합니다. 어떻게 생각해? – YotKay

답변