2016-10-27 13 views
1
void helloFiber(boost::fibers::future<void> &f) 
{ 
    cout << "Hello, boost::fiber" << endl; 
    f.get(); 
} 

int main() 
{ 
    boost::fibers::promise<void> pm; 
    boost::fibers::future<void> ft = pm.get_future(); 
    { 
     boost::fibers::fiber f(helloFiber, std::move(ft)); 
     cout << "Before join." << endl; 
     f.detach(); 
    } 
    pm.set_value(); 
    cout << "After join." << endl; 
    return 0; 
} 

이 프로그램 출력 : 가입하기 전에. 가입 후. 안녕하세요, 부스트 :: 섬유.fiber.detach() 이후에 실행하면?

출력되지 않는 이유 : 가입하기 전. 안녕하세요, boost :: fiber 가입 후에.

+0

후 왜해야합니까? 특정 순서로 실행이 예상되는 경우 순차적 코드를 작성해야합니다. 그렇지 않으면 부당한 가정을하지 마십시오. –

+0

창조 후 섬유가 즉시 구현되기를 바랍니다. 그러나 적절한 방법을 찾지 못하는 것 같습니다. fiber.join() 메서드가 차단되었습니다. 나는 막히지 않고 즉시 처형 되길 희망합니다. –

답변

0

향후 (향후 이동) helloFiber()의 서명을 rvalue 참조로 변경해야합니다.

섬유를 분리 했으므로 스케줄러가이 작업에 참여해야합니다 (예 : 파손시).

살펴 보시기 바랍니다 : http://www.boost.org/doc/libs/1_62_0/libs/fiber/doc/html/fiber/fiber_mgmt.html (섹션 열거 출시) :

'열거 출시 컨트롤이 새로 출시 섬유로 즉시 전달할지 여부를 지정합니다.'

boost::fibers::fiber f(boost::fibers::launch::post, helloFiber, std::move(ft)); 
boost::fibers::fiber f(boost::fibers::launch::dispatch, helloFiber, std::move(ft)); 

deafult는 포스트 -하지만 출력이 그래서 당신은 파견을 원하는 :

안녕하세요, 부스트 :: 섬유 는 전에 가입 할 수 있습니다. 가입 후.

결코 인쇄되지 않습니다. '가입하기 전에. 안녕하세요, 부스트 :: 섬유 후 조인. ' 당신이 넣어 때문에

cout << "Before join." << endl; 

boost::fibers::fiber f(helloFiber, std::move(ft)); 
+0

그래, 네 말이 맞아. 나는 발사를 잃어 버렸어. 감사. –