2017-12-23 1 views
0

어떻게 C++ 부스트를 사용하여 광섬유를 중단 (중단) 할 수 있습니까? C + 부스트를 사용하여 내가 섬유 가입 실행할 수있는 방법은 예를C++ boost : fiber - 최대 시간까지 광섬유를 방해하거나 대기 상태에 들어가려면 어떻게해야합니까?

fiber.stop() 

(시간)에 대한

(기본 API를 대기에 대한 항목 최대 시간을 허용 해달라고)? 예를 들어 :

fiber.join(1000);

는, 섬유를 중단 디스크에 직렬화 한 후 시스템을 다시로드 할 수 있습니까?

답변

1

boost.fiber는 std :: threads의 API 다음에 모델링됩니다. 인터럽트 기능이없고 시간 초과 조인이 아닙니다.

광섬유를 직렬화 할 수 없습니다. 광섬유 스택을 직렬화하는 것이 가능하기 때문입니다. 적어도 컴파일러 지원 없이는 불가능합니다.

컴파일러가 스택에 할당 된 개체에 대한 포인터를 처리해야하기 때문에 스택 serilization을 사용하지 않는 것이 좋습니다. 동일한 주소에서 객체를 다시 할당해야하거나 파이버를 직렬화 해제 한 후에 포인터를 다시 작성해야합니다 (다시로드).

RAII 위반이 쉽게 가능할 것입니다.

+0

귀하의 의견에 동의하지 않습니다. 1) 매우 진보 된 광섬유 모델을 만들면 OS 수준 또는 매우 낮은 수준에서 동일한 라이브러리를 사용할 수 있습니다.이 기능은 언어 및 광섬유 및 상호 운용성과의 비 호환성에 관련된 모든 실제 문제를 해결할 수 있습니다. 2) 광섬유 상태가 스레드에서 제거되기 직전에 직렬화가 발생하므로 절대 포인터 주소는 저장하지 않고 메모리의 상대 오프셋 만 저장하면됩니다. 직렬화 된 이식 가능한 상태를 만들 수 있습니다. 원한다면 할 수 있습니다. 그것은 불가능하지 않습니다. 그것에 대한 장점은 인상적입니다. –

+0

C++ 11은 std :: thread 중단을 제공하지 않았습니다. 이유를 추측하십시오. 스택을 직렬화하면 RAII를 위반 한 문이 열립니다. – xlrg

+0

예. 그렇기 때문에 섬유가 컴파일러 내부가 아니라 OS 내부에 생성 될 수 있습니다. 그것은 위반 문제를 해결하지만 가능성의 세계에 대한 문호를 열어주기 때문입니다. 이러한 이유 때문에 언어로 파이버를 만드는 방법은 파이버가 제공하는 가능성 (시리얼 라이 제이션, 태스크 마이 그 레이션)을 제한하기 때문에 더 좋은 방법은 아닙니다. 컴파일러는 궁극적으로 데이터 유형을 설명하는 2 단계 직렬화를 처리 할 수 ​​있습니다 , .... –

관련 문제