fsp*_*rit 6 multithreading pthreads thread-safety ios
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
Run Code Online (Sandbox Code Playgroud)
这应该足够明确了。
ETA: Alexander Staubo 指出,从 OS X 10.5/iOS 2.0 开始,您可以直接调用该-start方法NSThread,因此启用 Cocoa 多线程的最简单方法是:
void XXXActivateCocoaMultithreading(void) { [[NSThread new] start]; }
Run Code Online (Sandbox Code Playgroud)
然后,在你的main函数中:
XXXActivateCocoaMultithreading();
Run Code Online (Sandbox Code Playgroud)
这也很明确,但远没有那么混乱。( 是XXX为了提醒您为非静态函数添加前缀。由于静态函数通常在某些时候会变成非静态,因此从一开始就为它们全部添加前缀是一个不错的举措。)
| 归档时间: |
|
| 查看次数: |
1146 次 |
| 最近记录: |