iOS

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

2019-07-07  本文已影响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);

其中

简单实例:

#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!

上一篇下一篇

猜你喜欢

热点阅读