Один тред запускает другой тред для выполнения долгой операции и периодически опрашивает флаг завершения.
При установке флага — получает результаты.
boost::shared_ptr может быть использован как такой флаг.
void lengthy_work(boost::shared_ptr<void> completion_flag) { ... }
void caller()
{
boost::shared_ptr<void> completion_flag(new int);
boost::weak_ptr<void> completion_check(completion_flag);
boost::thread worker(lengthy_work, completion_flag);
completion_flag.reset();
...
case WM_TIMER:
if (completion_check.expired())
{
OperationComplete();
}
...
}
Преимущества:
1. Переносимо настолько, насколько потокобезопасность boost::shared_ptr переносима, при этом она реализована по возможности на атомарных операциях (см boost/smart_ptr/detail/ ).
2. Флаг завершения взводится неявно при возврате из потоковой функции, но при этом можно взвести его заранее явно.