2009-07-19 2 views
0

Я пытаюсь определить, действителен ли объект. Программа имеет (по крайней мере) два потока, и один из потоков может привести к недействительности объекта, удалив его из NSMutableArray. Мне нужен другой поток, чтобы проверить его существование или действительность, прежде чем действовать на него.Указать, недействителен ли объект

ответ

1

Многопоточное программирование сложно. Hard не начинает фиксировать, насколько это сложно. Это тот тип, в котором общий, полезный, «разумно квалифицированный» способ детерминированного объединения двух разных чисел, которые мутируются и разделяются несколькими потоками в ограниченное время без использования какой-либо специальной помощи от CPU в форме атомных инструкций станет крупным прорывом и тезисом вашего доктора философии. Божество по вашему выбору публично поблагодарит вас за ваш вклад в человечество. Просто для добавления двух чисел вместе. На самом деле многопоточное программирование еще сложнее.

Посмотрите на: Technical Note TN2059 Using collection classes safely with multithreaded applications. Он охватывает эту тему в целом и описывает некоторые из неочевидных ловушек, которые ждут вас.

0

Вы говорите

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

Самый простой способ удержать индекс объекта в NSMutableArray, а затем выполните следующие действия

if(myObject == [myArray objectAtIndex: myObjectIndex]) { 

    // everything is good ! 
} 
else { 
    // my object is not what I think it is anymore 
} 

Есть четкая проблема с этим подходом, однако

  1. вставки, и удаление наполнит вас
  2. Подход не является потокобезопасным, так как массив можно изменить, пока вы его читаете

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

+0

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

+0

Я согласен с Вашим комментарием, я добавлю его в мой ответ – hhafez

+0

Интересно, имеет ли значение вопрос о том, является ли это * недействительным * и спрашивает, действительно ли это *. Возможно, я слишком глубоко задумываюсь? –

2

Вы не можете. Единственный способ проверить, сохраняет ли ваш объект указатель объекта действительный объект, - это разыменовать его, но разыменование «недопустимого» объекта (по которому я предполагаю, что вы имеете в виду тот, который был отменен) приведет к доступу к памяти новый объект, который был выделен в том же месте, данные мусора, которые могут быть или не быть идентичными нормальному объекту, или страницу без памяти, которая приведет к немедленному EXEC_BAD_ACCESS.

Каждый раз, когда вы держите ссылку на объект, который вы можете использовать в будущем, вы должны его сохранить. Если вы этого не сделаете, вы не проявили никакого интереса или права собственности на объект, и система может выбросить его в любое время.

Использование объективных C-аксессуаров и свойств вместо прямой установки иголов и использования удержания/освобождения упрощает выполнение правильной вещи совсем немного.

+0

У меня нет выбора, чтобы сохранить его. Один из потоков - это просто наблюдатель и не должен взаимодействовать с объектами. –

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