Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, remark, Вы писали:
R>>А вот с "получает результаты" заминочка. Предложенный вариант не будет работать, т.к. weak_ptr<>::expired() не передаёт видимость данных между потоками, которые освободили ассоциированный shared_ptr, и потоком которому expired() вернул true (кто-то обещал?).
AG>угу, понял.
Этот флаг можно было бы легко реализовать самому... если бы не отсутствие портируемых атомарных операций. С приходом великого и могучего C++0x жизнь станет гораздо проще:
std::atomic<bool> completion;
// on thread end, or manually by thread function:
completion.store(true, std:memory_order_release);
// completion polling
if (completion.load(std:memory_order_acquire) == true))
...
R>>Да и вообще необходимость использования поллинга как-то смущает, почему не сделать просто:
R>>R>>boost::thread worker ([]()
R>>{
R>> lengthy_work(...);
R>> PostMessage(current_thread_id, WM_WORK_ACCOMPLISHED, work_id, 0);
R>>});
R>>
AG>В таком варианте смущает возможность удаления адресата PostMessage до вызова PostMessage, во время вызова PostMessage, между PostMessage и получением сообщения — прийдётся предусмотреть проверку "существует ли адресат" и продление жизни адресата на время отправки сообщения.
Ну тут я подразумевал, что получатель WM_WORK_ACCOMPLISHED живёт столько же, сколько в твоём коде жил обработчик WM_TIMER. Если получатель может удалиться, не дождавшишь получения, то надо наворачивать что-то ещё.
AG>