在Cocoa中,相当于C#的'Thread.Join()'是什么?

3
我正在使用线程制作 iPhone 应用程序。之前我用过C#,那里有一个方法叫做Thread.Join(),它会阻塞当前线程直到特定的线程执行完成。在 Cocoa 中有相当的方法吗?或者有其他替代方法吗?
---编辑---
PS. 我正在使用NSThread。
---编辑---
我正在寻找一种类似于“waitForThreadExit”的方法,它可以阻塞调用者线程直到线程执行完成。
4个回答

4
使用Cocoa创建的线程无法作为分离线程创建。由于资源管理原因,NSThread实例始终包装已连接的POSIX线程。正如在线程编程指南中引用的那样:
如果您确实想要创建可加入的线程,则唯一的方法是使用POSIX线程。 POSIX默认情况下将线程创建为可加入状态。要将线程标记为分离或可加入,请在创建线程之前使用pthread_attr_setdetachstate函数修改线程属性。线程开始后,您可以通过调用pthread_detach函数将可加入线程更改为分离线程。有关这些POSIX线程函数的更多信息,请参见pthread man页面。有关如何加入线程的信息,请参见pthread_join man页面。
如果您正在寻找一种通知NSThread结束的方法,则可以使用NSThreadWillExitNotification通知。

感谢您的回答。您提供的信息非常有用!很抱歉我不能将其设置为被接受的答案。如果我可以接受多个答案,我也会接受这个答案。 - eonil

1

如果您正在使用pthreads,则使用:pthread_join

另一方面,如果您正在使用NSThread类,则没有等效于您所指的join方法。

您可以尝试使用NSObject的消息performSelectorOnMainThread:withObject:waitUntilDone:

但我不确定您在这里想要实现什么。

这里是苹果的多线程编程指南。


抱歉,我正在使用NSThread。有没有办法在NSThread上使用该方法? - eonil
我不完全理解你的问题,但是你是否查看了NSThread文档?http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSThread_Class/Reference/Reference.html - Niklas Berglund
是的,但我找不到像“waitForThreadExit”这样的方法。我会更新我的问题更清楚。 - eonil
你所说的正是我在寻找的,但它只适用于pthread,所以我不知道如何将其用于NSThread。 - eonil
类似 while([thread isExecuting]) sleep(1); 这样的代码可以完成任务 :) - Ramy Al Zuhouri
@RamyAlZuhouri 看起来不错,似乎接近实际的低级别 join 实现。 - eonil

1

NSThread没有公开任何名称的Join方法。NSThread是一个非常简单、高级的包装类。它非常适用于在GUI应用程序中进行线程处理,因为它简化了回调到主线程的调用。对于简单的后台任务和在完成时将结果传回主线程,这应该足够,并且相当容易做到正确。如果您想要做更多“高级”事情(包括Join在内),那么您要么必须转向pthreads,要么在NSThread之上层叠语义(例如使用NSCondition)。


谢谢提供的信息。NSCondition可能会对我很有帮助! - eonil
1
NP,我认为像Laurent建议的那样,NSThreadWillExitNotification也可能很有用。祝好运。 - philsquared

0
你可以使用NSConditionLock自己完成这个操作。定义两个条件:“运行中”和“已终止”。工作线程获取锁“运行中”,在终止时使用条件“已终止”解锁。然后,加入将获取锁“已终止”,然后解锁它“已终止”。

几乎有用...除了NSThread注册tsd析构器释放/释放(并发地,当您期望线程生命周期结束时...可能会导致应用程序崩溃),没有join是一种可怕的设计(或更糟)。 - bestsss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接