Re[3]: Ещё одно применение shared_ptr
От: remark Россия http://www.1024cores.net/
Дата: 27.12.09 12:25
Оценка:
Здравствуйте, 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>


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.