Мне нужно разделить BLOB в многопоточном приложении, и теперь я просматриваю подход shared_ptr/weak_ptr, но я не совсем уверен, что это правильно.Совместное управление ресурсами в многопоточном приложении shared_ptr?
Существует рабочий поток, который создает класс ресурсов (новый CResource). CResource может быть довольно большим, поэтому я хочу избежать дополнительных копий.
Тогда есть еще один поток пользовательского интерфейса, я хочу, чтобы PostMessage с указателем на CResource для.
Но рабочий поток может выйти быстрее, чем поток пользовательского интерфейса или наоборот. И у работника нет способа узнать, обработано ли сообщение.
Так что мне интересно, могу ли я создать (новый shared_ptr) в рабочем потоке, а затем передать (new weak_ptr) функцию postmessage и, если он позаботится о автоматической очистке. Итак, если рабочий поток уничтожает его shared_ptr, поток пользовательского интерфейса вернет false на weak_ptr.lock, поэтому нет необходимости в дополнительной синхронизации и управлении ресурсами.
Также, что произойдет, если рабочий создаст новый CResource, начнется запуск потока пользовательского интерфейса, рабочие вызовы shared_ptr.reset (новый CResource)? Кажется, что поток пользовательского интерфейса может начать считывать удаленные данные в этот момент, если не выполняется блокировка?
Или что, если основной поток завершает работу и удаляет его shared_ptr во время очистки, является ли слабый_ptr болтаться?
Я новичок в этой общей/слабой работе, и документация для меня немного запутанна, поэтому извините меня, если это глупый вопрос.
Я был бы признателен, если бы кто-нибудь мог сказать мне, стоит ли исследовать этот вариант, или если есть несколько подводных камней и какой-то старый подход к школе лучше?
Ну, если основной поток выполнил выполнение указателя, он значительно истек, поэтому пропустить обновление в порядке. Вопрос в том, как weak_ptr будет знать, что shared_ptr больше не существует, поскольку он был удален со всеми реконфигурированными данными. Я не могу найти что-либо твердое в отношении безопасности ничтожных потоков. – Coder
Сценарий сброса также становится более запутанным, чем больше я думаю об этом. В основном два потока имеют ponting shared_ptr для ресурса A, поток a .get() 's raw pointer и кэширует его для локального доступа, поток B .reset() - shared_ptr, поток A считывает указатель .get() ted - 0x80000005? – Coder
@Madman - да, если вы используете 'shared_ptr', то это будет ошибкой. Вместо этого вы должны использовать 'shared_ptr', который используется обоими потоками, где каждый позволяет ему выйти из области действия, когда это будет сделано. Создайте совершенно новый 'shared_ptr' для хранения каждого рабочего элемента - не используйте' reset() 'в одном глобальном' shared_ptr'. –