Ответственность за управление памятью во время связи между потоками - PullRequest
1 голос
/ 31 августа 2010

Если поток A отправляет ссылку на объект в поток B, например, используя performSelector:onThread:withObject:waitUntilDone, как должно осуществляться управление памятью? Должен ли вызывающий поток alloc объект и вызываемый поток release это?

EDIT:

Оказывается, что performSelector:onThread:withObject:waitUntilDone сохраняет объект до тех пор, пока с ним не будет сделан селектор, который будет вызываться в цикле выполнения другого потока. Таким образом, вызывающий поток должен выделить, затем вызвать executeSelector, а затем освободить.

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

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

2 голосов
/ 15 сентября 2010

Оказывается, что performSelector:onThread:withObject:waitUntilDone сохраняет объект до тех пор, пока с ним не будет сделан селектор, который будет вызван в цикле выполнения другого потока. Таким образом, вызывающий поток должен alloc, затем вызвать performSelector:onThread:withObject:waitUntilDone, затем release.

1 голос
/ 31 августа 2010

Я не уверен, что здесь действительно есть «правильный» ответ.Если вызывающий поток вышел или иным образом не может отследить, что память больше не используется, и освободить ее, я думаю, вам придется сделать это в вызываемом потоке.Однако в целом я предпочитаю освобождать память в том же потоке, в котором она была выделена, в идеале рядом с кодом.

Я думаю, что ключ четко документирует ваши ожидания и поддерживает последовательность.*

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