将pthread转换为objective-c
我正在尝试将以下内容转换为将pthread转换为objective-c,objective-c,c,pthreads,Objective C,C,Pthreads,我正在尝试将以下内容转换为objective-ccode 这是我在C中的当前线程,运行良好 //calling EnrollThread method on a thread in C pthread_t thread_id; pthread_create( &thread_id, NULL, EnrollThread, pParams ); //What the EnrollThread method structure looks like in C void* EnrollTh
objective-c
code
这是我在C
中的当前线程,运行良好
//calling EnrollThread method on a thread in C
pthread_t thread_id;
pthread_create( &thread_id, NULL, EnrollThread, pParams );
//What the EnrollThread method structure looks like in C
void* EnrollThread( void *arg )
我的方法结构现在是什么样子的,我已经把它改成了objective-c
-(void)enrollThreadWithParams:(LPBIOPERPARAMS)params;
现在我不知道如何使用pthread\u create
调用调用这个objective-c
方法。
我试过这样的方法:
pthread_create( &thread_id, NULL, [refToSelf enrollThreadWithParams:pParams], pParams );
但我相信我错了。有人能告诉我为什么这不起作用,以及我需要做什么来修复它,以便在后台创建我的线程吗?我的UI将被锁定,直到方法完成它所做的事情
我也在考虑使用
dispatch\u sync
,但我还没有尝试过 在objective C中,您并没有真正使用pthread\u create
,尽管您仍然可以使用它,但线程入口点必须是一个C函数,因此我不确定这是否是最好的方法
有许多选项,您可以在和文档中阅读
NSObject(和子类)的方法performSelectorInBackground
(不是您提到的dispatch\u async
)dispatch\u sync
- NSOperation和NSOperationQueue
- NSThread类
我建议您尝试一下第一个,因为它是最简单、最直接的,第二个也很简单,因为您不必创建外部对象,只需将要并行执行的代码内联放置即可。在objective C中,您并不真正使用
pthread\u create
,尽管您仍然可以使用它,但是线程入口点需要是一个C函数,所以我不确定这是否是最好的方法
有许多选项,您可以在和文档中阅读
NSObject(和子类)的方法performSelectorInBackground
(不是您提到的dispatch\u async
)dispatch\u sync
- NSOperation和NSOperationQueue
- NSThread类
我建议您尝试一下第一个,因为它是最简单、最直接的,第二个也很简单,因为您不必创建外部对象,只需将要并行执行的代码内联放置即可。在objective C中,您并不真正使用
pthread\u create
,尽管您仍然可以使用它,但是线程入口点需要是一个C函数,所以我不确定这是否是最好的方法
有许多选项,您可以在和文档中阅读
NSObject(和子类)的方法performSelectorInBackground
(不是您提到的dispatch\u async
)dispatch\u sync
- NSOperation和NSOperationQueue
- NSThread类
我建议您尝试一下第一个,因为它是最简单、最直接的,第二个也很简单,因为您不必创建外部对象,只需将要并行执行的代码内联放置即可。在objective C中,您并不真正使用
pthread\u create
,尽管您仍然可以使用它,但是线程入口点需要是一个C函数,所以我不确定这是否是最好的方法
有许多选项,您可以在和文档中阅读
NSObject(和子类)的方法performSelectorInBackground
(不是您提到的dispatch\u async
)dispatch\u sync
- NSOperation和NSOperationQueue
- NSThread类
我建议您尝试一下第一个,因为它是最简单、最直接的,第二个也很简单,因为您不必创建外部对象,只需将代码内联以并行方式执行即可。如果您已经有了工作代码,那么就没有理由放弃pthreads。你应该能很好地使用它 但是,如果您想要一个替代方案,但希望保留现有的pthread入口点,那么可以很容易地做到这一点
dispatch_queue_t queue = dispatch_queue_create("EnrollThread", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
EnrollThread(parms);
});
如果您已经有了工作代码,那么就没有理由放弃pthreads。你应该能很好地使用它 但是,如果您想要一个替代方案,但希望保留现有的pthread入口点,那么可以很容易地做到这一点
dispatch_queue_t queue = dispatch_queue_create("EnrollThread", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
EnrollThread(parms);
});
如果您已经有了工作代码,那么就没有理由放弃pthreads。你应该能很好地使用它 但是,如果您想要一个替代方案,但希望保留现有的pthread入口点,那么可以很容易地做到这一点
dispatch_queue_t queue = dispatch_queue_create("EnrollThread", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
EnrollThread(parms);
});
如果您已经有了工作代码,那么就没有理由放弃pthreads。你应该能很好地使用它 但是,如果您想要一个替代方案,但希望保留现有的pthread入口点,那么可以很容易地做到这一点
dispatch_queue_t queue = dispatch_queue_create("EnrollThread", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
EnrollThread(parms);
});
并发编程的go-to参考是引导您通过调度队列(称为Grand Central dispatch,GCD)和操作队列的。两者都非常容易使用,并提供各自的优势 在最简单的形式中,这两种方法都非常容易使用。正如其他人所指出的,创建调度队列,然后向该队列调度某物的过程是:
dispatch_queue_t queue = dispatch_queue_create("com.domain.app", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
// something to do in the background
});
等效的操作队列为:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
// something to do in the background
}];
就个人而言,我更喜欢操作队列,其中:
- 我需要控制/有限的并发性(即,我将向该队列分配一组内容,我希望它们不仅与主队列并发运行,而且与其他队列并发运行,但我不希望同时运行的内容超过几个)。一个很好的例子是在执行并发网络请求时,您希望它们同时运行(因为您可以获得巨大的性能优势),但在任何给定的时间内,您通常不希望它们中的四个以上运行)。使用操作队列,可以指定
maxConcurrentOperation