Ещё одно применение shared_ptr
От: Alexander G Украина  
Дата: 26.12.09 13:47
Оценка: 7 (1) :)
Один тред запускает другой тред для выполнения долгой операции и периодически опрашивает флаг завершения.
При установке флага — получает результаты.

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. Флаг завершения взводится неявно при возврате из потоковой функции, но при этом можно взвести его заранее явно.
Русский военный корабль идёт ко дну!
shared_ptr weak_ptr threads
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.