Управление общими ресурсами в многопоточном приложении shared_ptr? - PullRequest
0 голосов
/ 11 октября 2010

Я должен поделиться большим двоичным объектом в многопоточном приложении, и в настоящее время я изучаю подход shared_ptr / weak_ptr, но я не совсем уверен, что он правильный.

Существует рабочий поток, который создает класс ресурсов (новый CResource). CResource может быть довольно большим, поэтому я хочу избегать лишних копий.

Затем есть другой поток пользовательского интерфейса, я хочу PostMessage с указателем на CResource.

Но рабочий поток может выходить быстрее, чем поток пользовательского интерфейса, или наоборот. И работник не может знать, было ли сообщение обработано.

Поэтому мне интересно, смогу ли я создать (новый shared_ptr) в рабочем потоке, а затем передать (новый слабый_птр) в функцию postmessage и, если она позаботится об автоматической очистке. Таким образом, если рабочий поток уничтожает свой shared_ptr, поток пользовательского интерфейса вернет false на слабый_пр.блок, поэтому не будет необходимости в дополнительной синхронизации и управлении ресурсами.

Кроме того, что произойдет, если работник создаст новый CResource, поток пользовательского интерфейса начнет работать, работник вызовет shared_ptr.reset (новый CResource)? Похоже, что поток пользовательского интерфейса может начать чтение удаленных данных в этот момент, если не выполняется блокировка?

Или что, если основной поток завершит работу и удалит свой shared_ptr во время очистки, будет ли слабый_птр зависать?

Я в некотором роде новичок во всем этом общем / слабом_птре, и документация сейчас немного смущает меня, поэтому извините, если это глупый вопрос.

Буду признателен, если кто-нибудь скажет мне, стоит ли исследовать этот вариант, или есть несколько ловушек, и какой-нибудь подход старой школы лучше?

1 Ответ

1 голос
/ 12 октября 2010

weak_ptr обычно используется для разбиения циклов во взаимозависимых структурах данных.

Я полагаю, что из приведенного вами описания это будет работать. Как только weak_ptr::lock будет успешным, вы будете в порядке, пока не вернете shared_ptr из области видимости.

Я не понимаю, почему вы не просто даете потоку пользовательского интерфейса shared_ptr своего собственного. Тогда вам не нужно беспокоиться о том, что shared_ptr в рабочем потоке исчезнет и заберет ваш BLOB-доступ. Подобный обмен данными - именно то, для чего идеально подходит shared_ptr.

...