Какой указатель удалить? - PullRequest
1 голос
/ 04 марта 2010

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

В этом классе есть переменные, которые содержат указатели на массивы, некоторые потоки имеют общие массивы, из которых они считывают данные, вместо того, чтобы дублировать эти массивы, указатели даются каждой функции, которая направляет их в один массив. Эти общие массивы инициализируются в основной программе, а затем переменные в массиве классов указываются на тот массив, который затем, в свою очередь, передается потоку.

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

Спасибо

-Faken

Ответы [ 3 ]

1 голос
/ 04 марта 2010

delete не изменяет указатель, но делает указанную память неиспользуемой.

Таким образом, после удаления какой-либо памяти вы не можете ссылаться на нее.Это справедливо как для одного указателя, так и для нескольких указателей:

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

1 голос
/ 04 марта 2010

Если вы удалите массив, который другой поток все еще использует, вы получите неопределенное поведение, вероятно, Mist завершится сбоем.

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

Другой возможностью будет использование общего указателя, который автоматически освободит ресурсы, как только их не использует ни один поток (хотя следует помнить, что вам необходимо защитить свой доступ к общему указателю - для shared_ptr в стандарте MSVC библиотека защищена автоматически ).

0 голосов
/ 04 марта 2010

все переменные внутри процесса (приложения) совместно используются потоками, любая модификация переменной или памяти будет влиять на все потоки, которые имеют к ней доступ, если только вы не используете локальное хранилище потоков (TLS).

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

Что касается вопроса "какого уровня", я думаю, что лучше освободить объект потоком, который создает объект, чтобы избежать путаницы, и убедитесь, что эти объекты больше не нужны другому потоку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...