Страницы

Поиск по вопросам

суббота, 9 марта 2019 г.

Как проверить, что поток NSThread заблокирован?

Давно хотел узнать, возможно ли для тестирования (unit testing) сделать следующее: Можно ли добавить в NSThread метод, который будет показывать, заблокирован (остановлен) ли данный поток или нет? Я предполагаю, что, если эта задача в принципе решается, было бы удобно сделать отдельную категорию NSThread+IsBlocked, содержащую такой метод и вполне достойную своего отдельного репозитория на Github ;) Прямо сейчас я занимаюсь NSCondition - вот цепь вызовов, которую для остановки потока делает -[NSCondition wait]: [NSCondition wait] pthread_cond_wait$UNIX2003 _pthread_cond_wait __psynch_cvwait Кроме NSCondition есть множество других способов блокировать/останавливать потоки NSThread: dispatch semaphores, NSConditionLock, [NSThread sleepForTimeInterval:] и т.п. - я знаю Objective-C лишь на уровне iOS-разработчика, поэтому не имею представления, возможно ли написать такой метод, который будет показывать факт блокировки потока сразу для всех этих способов. Буду признателен даже за метод, работающий только с NSCondition и __psynch_cvwait. Вот простой пример того, чего я хотел бы добиться (искомый метод - isBlocked): // Some test case // ...
__block NSThread *thread; NSCondition *condition = [NSCondition alloc] init];
dispatch_async(someQueue(), ^{ thread = NSThread.currentThread;
[condition lock]; [condition wait]; [condition unlock]; });
while(1) { NSLog(@"Thread is blocked: %d", thread.isBlocked); } Я не знаток чистого C и POSIX threads, поэтому, если знаете ответ, сделайте его, пожалуйста, развёрнутым. Примечание: речь идёт именно о блокировании (остановке) потока, а не о проверке isLocked вроде "Находимся ли мы @synchronized {}?"


Ответ

Мир - Россия 1:0 - ответ получен в топике, который параллельно с этим был открыт мной на SO: Is it possible to check if an NSThread is blocked?.
Там см. принятый ответ. Очень изящное решение для NSCondition.
Заодно показывающее, как можно красиво модифицировать поведение классов, подменяя методы друг другом (по логике отдалённо напоминает alias_method_chain в Ruby).

Комментариев нет:

Отправить комментарий