2010-10-11 3 views
0

Мне нужно разделить 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 болтаться?

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

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

ответ

1

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

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

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

+0

Ну, если основной поток выполнил выполнение указателя, он значительно истек, поэтому пропустить обновление в порядке. Вопрос в том, как weak_ptr будет знать, что shared_ptr больше не существует, поскольку он был удален со всеми реконфигурированными данными. Я не могу найти что-либо твердое в отношении безопасности ничтожных потоков. – Coder

+0

Сценарий сброса также становится более запутанным, чем больше я думаю об этом. В основном два потока имеют ponting shared_ptr для ресурса A, поток a .get() 's raw pointer и кэширует его для локального доступа, поток B .reset() - shared_ptr, поток A считывает указатель .get() ted - 0x80000005? – Coder

+0

@Madman - да, если вы используете 'shared_ptr', то это будет ошибкой. Вместо этого вы должны использовать 'shared_ptr ', который используется обоими потоками, где каждый позволяет ему выйти из области действия, когда это будет сделано. Создайте совершенно новый 'shared_ptr' для хранения каждого рабочего элемента - не используйте' reset() 'в одном глобальном' shared_ptr'. –

Смежные вопросы