int xxx()
{
return 5;
}
int main()
{
boost::thread th;
th = boost::thread(xxx);
th.join();
return 0;
}
boost :: promise를 사용하지 않고 xxx() 메서드에서 반환 된 값을 catch하는 방법은 무엇입니까?boost :: promise를 사용하지 않고 부스트 스레드의 반환 값
int xxx()
{
return 5;
}
int main()
{
boost::thread th;
th = boost::thread(xxx);
th.join();
return 0;
}
boost :: promise를 사용하지 않고 xxx() 메서드에서 반환 된 값을 catch하는 방법은 무엇입니까?boost :: promise를 사용하지 않고 부스트 스레드의 반환 값
xxx
, 결과에 어딘가에 액세스 할 수있는 다른 함수를 호출하십시오. 아마 약속이 최선의 선택 일지 모르지만, 동기화에주의를 기울이는다면 약속을 지역 변수에 직접 쓸 수 있습니다.
auto future = boost::async(boost::launch::async, xxx);
int result = future.get();
사실 난
적합 동기화 (뮤텍스 뮤텍스 + 조건 변수)
샘플러와 공유 객체를 사용하여 편집 할 수 없습니다() 주 &에 메소드 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;
}
또는 결과를 원할 때 단순히 스레드에 참여할 수 있습니다. 이것은 지나치게 복잡한이 춤과 같은 동기화를 줄 것입니다. –
@MikeSeymour 면밀히 살펴보면, 나는 샘플에서 그 사실을 정확하게 보여주고 있음을 알 수있을 것입니다 (_hint_ :'return global'). 또한 대답은 첫 줄에 있습니다. 코드는 앞서 언급 한 추상화를 샘플링하는 것입니다. – sehe
OK. 나에게 대답은 결과를 검색하기 위해 단순한 '조인'이 아니라 복잡한 춤이 필요하다는 것을 암시하는 것처럼 보였다. 아마 나는 그것에 너무 많이 읽고 있었다. –
왜 원하지 않는로 예를
코멘트에서 언급 한 바와 같이를 들어, 당신에게 비동기 적으로 소위 함수의 반환 값을 검색 할 수있는 미래를 제공하는 편리한
async
기능이있다 약속을 사용합니까? 유일한 대안은 똑같은 것을하는 무언가를 쓰는 것이고, 그것은 무의미한 것처럼 보입니다. –사실 내가 main & method xxx()에서 뭔가를 변경하고 싶습니다. 편집 할 수 없습니다 – Bakkya
@Bakkya boost :: future? – UldisK