将pthread转换为objective-c

时间:2014-03-19 18:29:58

标签: objective-c c pthreads

我正在尝试将以下内容转换为objective-c代码。

这是我在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;

现在我不确定如何使用objective-c来调用此pthread_create方法。 我尝试过这样的事情:

pthread_create( &thread_id, NULL, [refToSelf enrollThreadWithParams:pParams], pParams );

但我相信我错了。任何人都可以告诉我为什么这不起作用,我需要做什么来修复它,以便我可以在后台创建我的线程?我的UI被锁定,直到该方法完成它正在做的事情。

我在考虑使用dispatch_sync,但我还没有尝试过。

3 个答案:

答案 0 :(得分:2)

在目标C中你没有真正使用pthread_create,虽然你仍然可以使用它,但是线程入口点需要是一个C函数,所以我不确定这是否是最好的方法。

有许多选项,您可以在ThreadingConcurrency文档中阅读。

  • performSelectorInBackground NSObject(和子类)的方法
  • dispatch_async(不是你提到的dispatch_sync
  • NSOperation和NSOperationQueue
  • NSThread class

我建议给它第一个,因为它是最简单的,非常简单,第二个也很容易,因为你不必创建外部对象,你只需要将代码内联到并行执行。

答案 1 :(得分:1)

并发编程的参考是Concurrency Programming Guide,它引导您完成调度队列(称为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
}];

就个人而言,我更喜欢操作队列:

  • 我需要受控/有限的并发(即我要将一堆东西发送到该队列,我希望它们不仅针对主队列而且还针对主队列运行并发彼此,但我不想要多个同时运行的人。一个很好的例子就是在进行并发网络请求时,你希望它们同时运行(因为你获得了巨大的性能优势)但你通常不希望在任何给定的时间运行超过四个。使用操作队列,可以指定maxConcurrentOperationCount,而这与GCD相关更难。

  • 我需要对依赖项进行精细控制。例如,我将开始操作A,B,C,D和E,但B依赖于A(即B不应该在A完成之前开始),D依赖于C,并且E取决于B和D的完成。

  • 我需要在自己异步运行的任务上享受并发性。通过使用使用"并发操作"的isFinished子类,操作提供了对确定何时将操作声明为NSOperation的内容的精细控制。一个常见的例子是网络操作,如果使用基于委托的实现,它将异步运行,但您仍然希望使用操作来控制一个到另一个的流。例如,非常好的网络库AFNetworking因此广泛使用操作。

另一方面,GCD非常适合简单的一次性异步任务(因为你可以利用自己的内置"全局队列",让你自己自己排队),串行队列同步对某些共享资源的访问,调度源如定时器,在具有信号量的线程之间发送信号等.GCD通常是人们开始在Cocoa和Cocoa Touch中进行并发编程的地方。

最重要的是,我个人使用操作队列进行应用程序级异步操作(网络队列,图像处理队列等),其中并发程度成为重要问题)。我倾向于将GCD用于较低级别的东西或快速简单的东西。 GCD(带dispatch_async)是一个很好的起点,当你把脚趾插入并发编程的海洋时,所以去吧。

无论您使用这两项技术中的哪一项,我都鼓励您注意两件事:

  1. 首先,请记住(至少在iOS中)您总是希望在主队列上执行用户界面任务。所以常见的模式是:

    dispatch_async(queue, ^{
        // do something slow here
    
        // when done, update the UI and model objects on the main queue
    
        dispatch_async(dispatch_get_main_queue(), ^{
            // UI and model updates can go here
        });
    });
    

    [queue addOperationWithBlock:^{
        // do something slow here
    
        // when done, update the UI and model objects on the main queue
    
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            // do UI and model updates here
        }];
    }];
    
  2. 要考虑的另一个重要问题是同步和线程安全"。 (请参阅线程编程指南的Synchronization部分。)例如,您要确保没有主线程填充某些表视图,而在同时,一些后台队列正在同时更改该表视图使用的数据。您希望确保在任何给定线程使用某个模型对象或其他共享资源时,另一个线程不会改变它,使其处于某种不一致状态。

  3. 在并发编程领域,有太多内容无法涵盖。 WWDC视频(包括2011年和2012年)提供了关于GCD和异步编程模式的一些很好的背景,因此请确保您利用这一优秀资源。

答案 2 :(得分:0)

如果您已经有工作代码,则没有理由放弃pthread。你应该可以使用它。

但是,如果你想要一个替代方案,但是你想保留现有的pthread入口点,你可以很容易地做到这一点......

dispatch_queue_t queue = dispatch_queue_create("EnrollThread", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
    EnrollThread(parms);
});