美文网首页iOS
iOS-多线程(二)Pthread了解与简单使用

iOS-多线程(二)Pthread了解与简单使用

作者: 厦门_小灰灰 | 来源:发表于2019-07-07 17:22 被阅读0次

    Pthread介绍与简单使用

    介绍

    来自百度百科
    POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。

    简单使用
    1. 导入头文件:
    #import <pthread.h>
    
    1. 创建线程
        /**
         pthread 创建线程
    
         参数含义:
         1.指向线程标识符的指针;
         2.设置线程属性;
         3.线程运行函数的起始地址(函数指针);
         4.运行函数的参数;
         
         返回值:
         若线程创建成功,则返回0。若线程创建失败,则返回出错编号;
         */
    int pthread_create(pthread_t _Nullable * _Nonnull __restrict,
                           const pthread_attr_t * _Nullable __restrict,
                           void * _Nullable (* _Nonnull)(void * _Nullable),
                           void * _Nullable __restrict);
    

    其中

    • pthread_t:线程ID;
    • pthread_attr_t:线程属性;

    简单实例:

    #import "ViewController.h"
    #import <pthread.h>
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //声明一个pthread
        pthread_t pthreadId = NULL;
        //number为要传入执行函数的参数值
        int number = 10;
        //创建线程
        int result = pthread_create(&pthreadId,
                                    NULL,
                                    run,
                                    &number);
        //根据结果,做相关操作
        if ( result == 0 ) {
            NSLog(@"线程创建成功");
        } else {
            NSLog(@"线程创建失败:%d", result);
        }
        
    }
    
    void *run(void *args)
    {
        int number = (int)(*((int *)args));
        NSLog(@"%@,number=%d", [NSThread currentThread], number);
        return NULL;
    }
    
    @end
    
    

    打印结果:

    2019-07-07 17:08:14.591579+0800 NSThreadDemo[1817:45496] 线程创建成功
    2019-07-07 17:08:14.591740+0800 NSThreadDemo[1817:45553] <NSThread: 0x60000211a700>{number = 3, name = (null)},number=10
    

    关于上面执行函数的参数,可以传入OC对象,不过要做相应类型的转换,比如传NSString对象:

    NSString *string = @"hui";
    int result = pthread_create(&pthreadId,
                                    NULL,
                                    run,
                                    (__bridge void *)(string));
    
    执行函数:
    void *run(void *args)
    {
        NSString *string = (__bridge NSString *)args;
        NSLog(@"%@,string=%@", [NSThread currentThread], string);
        return NULL;
    }
    

    关于__bridge,我会在后续的文章中讲到,到时候将文章地址贴与此。

    补充知识点
    1. idvoid *的区别:
      id:指向任意一个Objective-C类的对象指针,Objective-C类,Objective-C类,Objective-C类;
      void *:指向任何其他数据类型的指针;

    2. C和OC之间传递数据的时候,需要桥接(__bridge),桥接是告诉编译器如何管理内存;

    over!

    相关文章

      网友评论

        本文标题:iOS-多线程(二)Pthread了解与简单使用

        本文链接:https://www.haomeiwen.com/subject/cizbhctx.html