Apple线程指南说:
对于多线程应用程序,Cocoa框架使用锁和其他形式的内部同步来确保它们的行为正确。但是,为了防止这些锁在单线程情况下降低性能,Cocoa不会创建它们,直到应用程序使用NSThread类生成其第一个新线程。如果仅使用POSIX线程例程生成线程,Cocoa不会收到它需要知道您的应用程序现在是多线程的通知。当发生这种情况时,涉及Cocoa框架的操作可能会使您的应用程序不稳定或崩溃。
为了让Cocoa知道你打算使用多个线程,你所要做的就是使用NSThread类生成一个线程并让该线程立即退出。你的线程入口点不需要做任何事情。只是使用NSThread生成线程的行为足以确保Cocoa框架所需的锁定到位。
在我的iOS应用程序中,我从一开始就从C ++代码开始几个pthread。为了确保应用程序的行为正确,根据上面的文档,我创建了一个无效的假NSThread。我不喜欢创建这样无用的代码(通常它是WTF,当你第一次阅读它时)我想避免这样做。有没有更好的方法将我的应用程序置于多线程模式?
答案 0 :(得分:3)
如果有,它不公开,可能不稳定。
如果您在代码中使用WTF,请重命名并重新调整内容以使其有意义。由于你需要一个带有虚拟选择器的虚拟对象,你可以添加一个像CocoaMultithreading
这样的一次性类,然后发送一条+beginMultithreading
消息:
@interface CocoaMultithreading : NSObject
+ (void)beginMultithreading;
@end
int
main(void) {
[CocoaMultithreading beginMultithreading];
/* now do whatever you want */
return EXIT_SUCCESS;
}
@implementation CocoaMultithreading
+ (void)dummyThread:(id)unused
{
(void)unused;
}
+ (void)beginMultithreading
{
[NSThread detachNewThreadSelector:@selector(dummyThread:)
toTarget:self withObject:nil];
}
@end
这应该足够明确。
ETA: Alexander Staubo指出,自OS X 10.5 / iOS 2.0起,您可以在-start
上调用NSThread
方法直接,所以翻转Cocoa多线程的最简单方法是:
void XXXActivateCocoaMultithreading(void) { [[NSThread new] start]; }
然后,在main
函数中:
XXXActivateCocoaMultithreading();
这也是明确的,但不那么混乱。 (XXX
用于提醒您为非静态函数添加前缀。由于静态函数在某些时候通常会变为非静态函数,因此从一开始就为它们添加前缀是一个很好的举措。)