繁体   English   中英

有没有办法进入Cocoa多线程模式而不创建假的NSThread?

[英]Is there any way to enter Cocoa multithreaded mode without creating fake NSThread?

Apple线程指南说:

对于多线程应用程序,Cocoa框架使用锁和其他形式的内部同步来确保它们的行为正确。 但是,为了防止这些锁在单线程情况下降低性能,Cocoa不会创建它们,直到应用程序使用NSThread类生成其第一个新线程。 如果仅使用POSIX线程例程生成线程,Cocoa不会收到它需要知道您的应用程序现在是多线程的通知。 当发生这种情况时,涉及Cocoa框架的操作可能会使您的应用程序不稳定或崩溃。

为了让Cocoa知道你打算使用多个线程,你所要做的就是使用NSThread类生成一个线程并让该线程立即退出。 你的线程入口点不需要做任何事情。 只是使用NSThread生成线程的行为足以确保Cocoa框架所需的锁定到位。

在我的iOS应用程序中,我从一开始就从C ++代码开始几个pthread。 为了确保应用程序的行为正确,根据上面的文档,我创建了一个无效的假NSThread。 我不喜欢创建这样无用的代码(通常它是WTF,当你第一次阅读它时)我想避免这样做。 有没有更好的方法将我的应用程序置于多线程模式?

如果有,它不公开,可能不稳定。

如果您在代码中使用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以来,您可以直接在NSThread上调用-start方法,因此翻转Cocoa多线程的最简单方法是:

void XXXActivateCocoaMultithreading(void) { [[NSThread new] start]; }

然后,在你的main功能:

XXXActivateCocoaMultithreading();

这也是明确的,但不那么混乱。 XXX用于提醒您为非静态函数添加前缀。由于静态函数在某些时候通常会变为非静态函数,因此从一开始就为它们添加前缀是一个很好的举措。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM