Какой эквивалент C # 'Thread.Join ()' в Какао? - PullRequest
3 голосов
/ 07 февраля 2010

Я делаю приложение для iPhone, используя темы. Некоторое время я использовал C #, был метод Thread.Join(), который блокирует текущий поток для конкретного потока, завершающего выполнение. Каков эквивалент в Какао для этого? Или альтернативы?

--- редактировать ---

PS. Я использую NSThread.

--- редактировать ---

Я нахожу метод, подобный 'waitForThreadExit', который блокирует поток вызывающего до тех пор, пока поток не завершит выполнение.

Ответы [ 4 ]

4 голосов
/ 07 февраля 2010

Потоки, созданные с помощью какао, нельзя создавать как отдельные. Экземпляры NSThread всегда обертывают присоединенные потоки POSIX по причинам управления ресурсами. Как указано в Руководстве по программированию потоков :

Если вы хотите создать присоединяемый темы, единственный способ сделать это используя потоки POSIX. POSIX создает темы как присоединяемые по умолчанию. к пометить поток как отдельный или присоединяемый, изменить атрибуты потока, используя функция pthread_attr_setdetachstate до создания темы. После нить начинается, вы можете изменить присоединяемая нить к отдельной нити вызвав pthread_detach функция. Для получения дополнительной информации о эти функции потока POSIX, см. pthread man page. Для получения информации о как присоединиться к теме, см. Страница руководства pthread_join.

Если вы ищете способ получения уведомления о завершении NSThread, вы можете использовать уведомление NSThreadWillExitNotification .

1 голос
/ 07 февраля 2010

NSThread не предоставляет метод Join ни по какому имени. NSThread - это очень простой высокоуровневый класс-оболочка. Это очень полезно для выполнения потоков в приложении с графическим интерфейсом, поскольку упрощает обратный вызов основного потока. Для простого фонового выполнения задач и передачи результата обратно основному потоку по завершении этого должно быть достаточно, и его довольно легко получить правильно. Если вы хотите сделать более «продвинутые» вещи (включая сюда присоединение), вам придется либо перейти к pthreads, либо наложить семантику поверх NSThread (возможно, с помощью NSCondition ). 1003 *

1 голос
/ 07 февраля 2010

Если вы используете pthreads, используйте: pthread_join .

С другой стороны, если вы используете класс NSThread , нет эквивалента методу join , на который вы ссылаетесь.

Вы можете попробовать с сообщением NSObject executeSelectorOnMainThread: withObject: waitUntilDone:

Но я не совсем уверен, чего вы здесь добиваетесь.

Вот - руководство по программированию многопоточности Apple.

0 голосов
/ 08 августа 2010

Вы можете сделать это самостоятельно, используя NSConditionLock. Определите два условия: «работает» и «прекращено». Рабочий поток получает блокировку «работает» и по завершении он разблокируется с условием «прекращено». Соединение тогда должно было бы получить блокировку «прекращено», а затем разблокировать ее «прекращено».

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