Как изменить точки общего указателя на объект, пока он занят другими потоками?

#c #multithreading #boost #shared-ptr

#c #многопоточность #повышение #общий-ptr

Вопрос:

Итак, у нас есть общий указатель на общий массив. В настоящее время у нас есть N потоков, использующих этот shared_array. Какой-то генератор выдал нам новый shared_array. Мы хотим позволить старым потокам использовать этот старый общий массив и просто автоматически освобождать его, когда все N первых потоков выходят за пределы области видимости, в то время как мы хотим предоставить новым потокам, которые вызывают его в первый раз, новый shared_array, предоставленный нашим генератором. Возможно ли это с помощью boost и как это сделать?

Ответ №1:

Каждый поток может содержать локальный общий указатель, который указывает на массив.

Когда они начинают работать с массивом, они просто запрашивают массив у поставщика.

Таким образом, они будут указывать на массив, который в данный момент активен. Они будут удерживать этот массив до тех пор, пока не будут завершены, и этот массив будет удален, когда больше не будет ссылок.
Когда предоставляется новый массив, к нему будет получен доступ, когда потоки снова запросят массив.

Ответ №2:

То, что вы описываете, — это ожидаемое использование «MT-безопасного» (но не надежного MT-безопасного) интеллектуального указателя с подсчетом ссылок, например, повышающих.