Я должен поделиться большим двоичным объектом в многопоточном приложении, и в настоящее время я изучаю подход shared_ptr / weak_ptr, но я не совсем уверен, что он правильный.
Существует рабочий поток, который создает класс ресурсов (новый CResource). CResource может быть довольно большим, поэтому я хочу избегать лишних копий.
Затем есть другой поток пользовательского интерфейса, я хочу PostMessage с указателем на CResource.
Но рабочий поток может выходить быстрее, чем поток пользовательского интерфейса, или наоборот. И работник не может знать, было ли сообщение обработано.
Поэтому мне интересно, смогу ли я создать (новый shared_ptr) в рабочем потоке, а затем передать (новый слабый_птр) в функцию postmessage и, если она позаботится об автоматической очистке. Таким образом, если рабочий поток уничтожает свой shared_ptr, поток пользовательского интерфейса вернет false на слабый_пр.блок, поэтому не будет необходимости в дополнительной синхронизации и управлении ресурсами.
Кроме того, что произойдет, если работник создаст новый CResource, поток пользовательского интерфейса начнет работать, работник вызовет shared_ptr.reset (новый CResource)? Похоже, что поток пользовательского интерфейса может начать чтение удаленных данных в этот момент, если не выполняется блокировка?
Или что, если основной поток завершит работу и удалит свой shared_ptr во время очистки, будет ли слабый_птр зависать?
Я в некотором роде новичок во всем этом общем / слабом_птре, и документация сейчас немного смущает меня, поэтому извините, если это глупый вопрос.
Буду признателен, если кто-нибудь скажет мне, стоит ли исследовать этот вариант, или есть несколько ловушек, и какой-нибудь подход старой школы лучше?