2015-01-07 5 views
0
int xxx() 
{ 
    return 5; 
} 

int main() 
{ 
    boost::thread th; 
    th = boost::thread(xxx); 
    th.join(); 
    return 0; 
} 

boost :: promise를 사용하지 않고 xxx() 메서드에서 반환 된 값을 catch하는 방법은 무엇입니까?boost :: promise를 사용하지 않고 부스트 스레드의 반환 값

+5

왜 원하지 않는로 예를

코멘트에서 언급 한 바와 같이
int result; th = boost::thread([&]{result = xxx();}); // Careful! result will be modified by the thread. // Don't access it without synchronisation. th.join(); // result is now safe to access. 

를 들어, 당신에게 비동기 적으로 소위 함수의 반환 값을 검색 할 수있는 미래를 제공하는 편리한 async 기능이있다 약속을 사용합니까? 유일한 대안은 똑같은 것을하는 무언가를 쓰는 것이고, 그것은 무의미한 것처럼 보입니다. –

+0

사실 내가 main & method xxx()에서 뭔가를 변경하고 싶습니다. 편집 할 수 없습니다 – Bakkya

+0

@Bakkya boost :: future? – UldisK

답변

0

xxx, 결과에 어딘가에 액세스 할 수있는 다른 함수를 호출하십시오. 아마 약속이 최선의 선택 일지 모르지만, 동기화에주의를 기울이는다면 약속을 지역 변수에 직접 쓸 수 있습니다.

auto future = boost::async(boost::launch::async, xxx); 
int result = future.get(); 
+0

OP는 'int result = xxx();'이 효과가 있습니다. (메인에 표시되지 않은 작업이 더 많으면 아마 그 작업을 스레드에 넣을 수 있습니다.) – sehe

+0

@sehe : 아마도 xxx와 다른 작업을 할 수 있습니다. 이는 아마도 스레드가 존재하는 이유 일 것입니다. –

+0

표시된 것처럼 조인은 동시성을 나타냅니다. – sehe

0

사실 난

적합 동기화 (뮤텍스 뮤텍스 + 조건 변수)

샘플러와 공유 객체를 사용하여 편집 할 수 없습니다() 주 &에 메소드 XXX 뭔가를 변경하려면 내가 언급 한 옵션 중 (분명히 모든 것을 필요로하지는 않는다) :

int global = -1; 
std::mutex mtx; 
std::condition_variable cv; 

void xxx() 
{ 
    // do lot of work... 

    { 
     std::unique_lock<std::mutex> lk(mx); 
     global = 5; // safe because lock for exclusive access 
     cv.notify_all(); 
    } 

} 

int main() 
{ 
    boost::thread th(xxx); 

    { 
     // need to lock since the thread might be running 
     // this might block until `global` is actually set 

     std::unique_lock<std::mutex> lk(mx); 
     cv.wait(lk, [] { return global != -1; }); 
     std::cout << "global has been set: " << global << "\n"; 
    } 

    th.join(); 

    // here there is no locking need 
    return global; 
} 
+0

또는 결과를 원할 때 단순히 스레드에 참여할 수 있습니다. 이것은 지나치게 복잡한이 춤과 같은 동기화를 줄 것입니다. –

+0

@MikeSeymour 면밀히 살펴보면, 나는 샘플에서 그 사실을 정확하게 보여주고 있음을 알 수있을 것입니다 (_hint_ :'return global'). 또한 대답은 첫 줄에 있습니다. 코드는 앞서 언급 한 추상화를 샘플링하는 것입니다. – sehe

+0

OK. 나에게 대답은 결과를 검색하기 위해 단순한 '조인'이 아니라 복잡한 춤이 필요하다는 것을 암시하는 것처럼 보였다. 아마 나는 그것에 너무 많이 읽고 있었다. –