pthread

来源:互联网 发布:mac 启动 磁盘工具 编辑:程序博客网 时间:2024/05/29 14:09

#import <pthread.h>


- (void)pthreadDemo {

    /**
     pthread & socket
     
     返回值:
     
     - 若线程创建成功,则返回 0
     - 若线程创建失败,则返回出错编号
     
     参数:
     
     1> 第一个参数为指向线程标识符的指针
        1) 在 C 语言框架中,没有对象的概念,对象是通过结构体来实现的
        2) 通常"对象"的类型,会以 _t / Ref 结尾
        3) 定义的时候,不需要使用 '*'
     
     2> 第二个参数用来设置线程属性
     3> 第三个参数是线程运行"函数"的"起始地址"
     
        void *(*)(void *)
        * block 匿名的函数指针
        * 定义: 返回值 (^) (参数)
        
        在 C 语言中的 void * 和 OC 中的 id 是等价的
     
        id (函数名就是指向函数起始位置的地址 的别名) (id)
        * 数组名:指向数组第一个元素的地址
     
     4> 最后一个参数是运行函数的参数
     
     关于 __bridge - 桥接
     
     内存管理的概念:
     
     ARC 自动管理内存!
     特点:
     1> 编译器在编译代码的时候,会根据 "OC 代码"的结构,自动添加 retain/release/autorelease
     2> ARC 只负责 OC 部分的代码,不负责 C/C++ 语言部分的代码
     3> 如果开发的时候,涉及到混合语言开发,如果使用 C 语言的函数,出现 create/copy/retain/new 等字样,大多数需要程序员手动 'release',否则会出现内存泄漏
     4> 在混合开发的时候,如果涉及到 C 框架 和 OC 框架之间传递参数,需要使用 "桥接" 告诉编译器如何管理内存
        __bridge 就是保留原有的管理方式
     5> 提问:MRC 中需要使用桥接吗?不需要!MRC中所有内存都是程序员负责的!
     6> 提问:管理内存,管理的是哪一区域的内存:堆区!特点:alloc/copy/retain 等等字样的函数都是和堆区有关的!
     
    有关桥接的增加:直接利用 Xcode 的智能提示就可以!
     */

    pthread_t threadId = NULL;
    
    // 准备参数
    id str = @"hello thread";
    
    int result = pthread_create(&threadId, NULL, demo, (__bridge void *)(str));
    
    if (result) {
        NSLog(@"线程创建失败 %d", result);
    } else {
        NSLog(@"OK");
    }
}


// 线程要调用执行的函数
// [NSThread currentThread] 可以在所有的多线程技术中使用!
// 查看当前代码执行所在的线程
void * demo (void * param) {

    NSString *str = (__bridge NSString *)(param);
    
    NSLog(@"%@ --- %@", [NSThread currentThread], str);
    
    return NULL;
}

0 0