2011-12-11 2 views
4

나는 strand :: :: wrap과 strand :: post를 사용하여 게시하는 것을 구분하지 않는다. 두 가지 모두 직렬화를 보장하지만 아직 랩으로 직렬화하고 일관된 순서를 얻을 수없는 것처럼 보입니다. 둘 다 똑같은 일을해야 할 것처럼 보입니다. 언제 다른 것을 사용합니까?ASIO strand :: wrap은 순서대로 직렬화 할 필요가 없습니까?

mystrand(ioservice); 
    mystrand.post(myhandler1); 
    mystrand.post(myhandler2); 

이 내 두 핸들러 직렬화 심지어 스레드 풀에서 순서대로 실행됩니다 보장 : 여기

좀 더 상세 의사 코드입니다.

이제 아래의 내용과 어떻게 다른가요?

ioservice->post(mystrand.wrap(myhandler1)); 
    ioservice->post(mystrand.wrap(myhandler2)); 

그들은 똑같은 것처럼 보입니까? 왜 다른 것을 사용하나요? 나는 둘 다 사용하고 언제 사람이 다른 사람보다는 더 이해되는 때 알아내는 것을 시도하고 있다는 것을 본다.

답변

1

wrap은 호출 할 때 dispatch을 호출 할 호출 대상 객체를 만듭니다. wrap에 의해 반환 된 객체를 호출하지 않으면 아무 것도 일어나지 않습니다. 따라서 wrap의 결과를 호출하는 것은 dispatch과 같습니다. 이제 그 점이 post과 어떻게 비교됩니까? 설명서에 따르면 post이 호출 된 동일한 컨텍스트 (스택 프레임) 내에서 즉시 전달 된 함수를 호출 할 수 없다는 점에서 postdispatch과 다릅니다.

그래서 wrappost은 두 가지 방식으로 다릅니다. 즉, 행동의 직접 성과, 주어진 기능을 실행하기 위해 호출자 자신의 컨텍스트를 사용하는 능력입니다.

나는이 모든 것을 documentation으로 읽었습니다.

+1

미안하지만 내 질문에 너무 짧습니다. 의 차이는 무엇 : ioservice-> 포스트 (strand.wrap (myhandler1)) ioservice-> 포스트 (strand.wrap (myhandler2)) 및 strand.post이 (myhandler1 내가 의미하는 것은 이것이다) strand.post (myhandler2) 스트랜드는 ioservice로 생성되었습니다. 둘 다 사용되었으며 동일한 작업을 수행 할 것입니다. 즉, myhandler1과 myhandler2를 순서대로 직렬화할까요? –

1

mystrand(ioservice); 
mystrand.post(myhandler1); 
mystrand.post(myhandler2); 

myhandler1가 myhandler2

하지만

ioservice->post(mystrand.wrap(myhandler1)); 
ioservice->post(mystrand.wrap(myhandler2)); 

실행 순서 전에 실행할 mystrand 의해 보장이 방법 io_service 래핑 핸들러를 실행의 순서이다 : 게시물은 보장하지 않습니다.

관련 문제