multithreading - 如何安全地在主线程中使用[NSTask waitUntilExit]?

标签 multithreading cocoa nstask

我有一个多线程程序,需要一次运行许多可执行文件并等待它们的结果。

我在非主线程上运行的NSOperationQueue中使用[nstask waitUntilExit](在主线程上运行NSTask完全是不可能)。

我的程序随机崩溃或遇到断言失败,并且崩溃堆栈始终指向 waitUntilExit 运行的运行循环,该循环执行各种回调和处理程序,包括(恕我直言,错误地)KVO 和 bindings updating the UI ,这导致它们在非主线程上运行(它是 probably the problem described by Mike Ash )

如何安全地使用waitUntilExit

这是否是 waitUntilExit 本质上无法使用的问题,还是在使用 KVO 和 IB 绑定(bind)时我需要做一些特殊的事情(除了在主线程上显式调度我的回调)以防止它们在运行 waitUntilExit 的错误线程上进行处理?

最佳答案

正如 Mike Ash 指出的那样,您无法在随机运行循环上调用 waitUntilExit。很方便,但是没用。您必须在计算“这实际上方便吗?”时包括“不起作用”

但是,您可以在 10.7+ 中使用 terminationHandler。它不会泵送运行循环,因此不应产生此问题。您可以使用以下内容重新创建 waitUntilExit (未经测试;可能无法编译):

dispatch_group group = dispatch_group_create();
dispatch_group_enter(group);
task.terminationHandler = ^{ dispatch_group_leave(group); };
[task launch];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

// If not using ARC:
dispatch_release(group);

关于multithreading - 如何安全地在主线程中使用[NSTask waitUntilExit]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34996937/

相关文章:

iphone - 尝试使用cydia库: NSTask on Jailbroken iphone crashes with Segmentation fault: 11

使用 EJB 计时器服务的 Java 多线程

multithreading - 在不修改全局变量的线程中运行的Perl POE::Wheel::FollowTail

python - Pandas DataFrame 多线程没有性能提升

ios - 异步 block 的推荐设计模式?

objective-c - 如何在一致的环境中循环使用 NSTask 运行终端命令?

multithreading - 杂注中的 Haskell 线程模式开关

objective-c - 为什么我的 Cocoa 应用程序中的某些行需要永远运行?

iphone - 如何在IBAction中传递参数?

objective-c - 在 NSTask 中使用 launchctl