iOS多线程总结(1)——多线程相关概念及NSObject/NSThread的使用

树莓派驱动步进电机 步进电机一般由电机、驱动器构成,树莓派连接驱动器控制电机。 一、接线 DIR+/- 用于控制方向,PUL+/- 用于控制转动; 正极DIR+ 和 PUL+ 接到GPIO口,两个负极接到GPIO口或地线均可,控制的时候不使用。 实验中,DIR+ 接35口,PUL+ 接38口。 树莓派4B GPIO口如图所示 远离树莓派USB的一侧 是 1、2、3号口 二、驱动 DIR控制方向,使用高电平或低电平控制; PUL控制转动,使用脉冲驱动。 三、代码 import RPi.GPI. 阅读详情

一. 多线程的相关概念

1. 什么是进程?

在操作系统发展的早期,为了提高资源利用率,使程序在多道程序下能并发执行,并对并发执行的程序加以控制和描述,在操作系统中引入了进程的概念。多道程序技术最早用于多道批处理系统,系统内可以同时存在多道作业,但同一时刻,系统只处理一道作业,作业根据系统的调度算法执行,每一个作业又由若干个程序组成,每个程序都可以完成独立的任务,且一个作业里面的程序是按顺序先后执行的,一个正在运行的程序称作一个进程,一个作业相当于系统中的一条执行任务的路径。在现代操作系统中,一个进程是指操作系统中正在运行的一个应用程序,是系统进行资源分配和调度的基本单位,每一个进程之间都是独立的,每一个进程均运行在其专用且受保护的内存空间内。

2. 什么是线程?

在60年代操作系统中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。因此在80年代,即通用计算机系统发展的年代,出现了能独立运行的基本单位——线程(Threads)。在现代操作系统中,一个进程想要执行任务,必须得有线程,进程的所有任务都是在线程中执行,一个线程中任务的执行是串行的(即是按顺序的),一个线程要执行多个任务,只能一个一个地按顺序执行这些任务(指令代码),一个线程相当于进程中的一条执行任务的路径;一个进程可以有多条线程,但不能没有线程,至少要有一条线程(主线程)。线程是进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。

3. 什么是多线程?

在60年代操作系统,进程是系统拥有资源和独立运行的基本单位,它的创建、撤消与切换存在较大的时空开销,在80年代后的操作系统,为提高提高程序的执行效率,降低时空开销,引进线程的概念。多进程技术也是在这个时候出现的,具有多线程能力的计算机系统能够在同一时间执行多条线程。线程是系统独立调度和分派CPU的基本单位,在单处理机计算机系统中,多个线程是并发执行的,即系统中的多个线程根据线程调度算法快速地调度执行,如果调度的时间足够快,就造成多个线程并发执行的假象,但在同一时间,只有一条线程在执行;在有多个处理机或者有多核心处理器的计算机系统中,如果线程的数目小于处理机的数目(或小于处理器的核心数),多个线程一般是并行的(以线程调度算法而定),反之,线程一部分是并行一部分并发执行。

4. 多线程的优缺点

(1). 优点
能适当提高程序的执行效率
能适当提高资源利用率(CPU、内存利用率)

(2). 缺点
创建线程是有开销的,iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,也可以使用 -setStackSize: 方法设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间,如果开启大量的线程,每条线程被调度执行的频次会降低(线程的执行效率降低),会降低程序的性能,且线程越多CPU在调度线程上的开销就越大,程序设计也更加复杂(比如线程之间的通信、多线程的数据共享更复杂)。

结论:线程不是开启越多越好,而是合适就好,一般一个程序开3条左右比较合理。

5. 什么是主线程?

在有多线程技术的操作系统中,当一个程序启动时,就有一个进程被操作系统创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread),在iOS中称为“UI线程”。在iOS中主线程的主要作用是显示\刷新UI界面,处理UI事件(比如点击事件、滚动事件、拖拽事件等)。一般开发中不把耗时的操作放到主线程,因为耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验。主线程关系着整个应用程序的开始和结束,一般主线程终止了,进程也就随之终止。

6. 什么是子线程?

一个进程中,如果有多条线程,处了主线程外,都称为子线程(也叫后台线程或非主线程)。在单核CPU下,子线程和主线程会并发执行,在多核CPU下,可能会并行执行。子线程和主线程的执行没有先后,会根据系统的算法调度执行。iOS中子线程的作用一般用来处理一些耗时操作,或者可以通过多条子线程进行快速遍历。

注意:子线程在创建时只是申请了内存程序空间,但还并没有真正分配给二级线程,只有当子线程执行代码需要空间时才会真正分配。

7. iOS中多线程的实现方案

这里写图片描述

二. 多线程的实现

这里主要介绍:NSObject\NSThread\GCD\NSOperation,因为在iOS中pthread几乎不用,所以这里不进行介绍。

(一). NSObject

NSObject也可以创建多线程,因为Apple给NSObject实现了一个关于线程的分类 NSObject (NSThreadPerformAdditions)

@interface NSObject (NSThreadPerformAdditions)

// 用于线程通信,子线程传到主线程
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;

// 用于线程通信,子线程传到主线程,默认的运行时模式:kCFRunLoopCommonModes
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;

// 用于线程之间的通信
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array NS_AVAILABLE(10_5, 2_0);

// 用于线程之间的通信
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait NS_AVAILABLE(10_5, 2_0);

// 隐式创建线程,默认的运行时模式:kCFRunLoopCommonModes
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg NS_AVAILABLE(10_5, 2_0);

@end

(二). NSThread

1. 线程的创建与启动

// 创建线程
- (void)createThread {

    // 创建线程,NSThread的创建方法
    // 一个NSThread对象就是一个线程
    SJMNSThread *thread = [[SJMNSThread alloc] initWithTarget:self selector:@selector(run:) object:@"sjm"];

    // 设置线程的名字
    thread.name = @"线程";
    NSLog(@"%@",thread);

    // 启动线程
    // 线程一启动,就会在线程thread中执行self的run方法
    [thread start];

}

// 线程任务
- (void)run:(NSString *)string {

    // 获取当前线程
    NSThread *thread = [NSThread currentThread];
    thread.name = @"子线程";

    NSLog(@"%@-----%@",string,[NSThread currentThread]);

}

2. 其他创建线程的方法

// 创建线程后自动启动线程
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

// 隐式创建并启动线程,此方法来自NSObject的分类 NSObject (NSThreadPerformAdditions)
[self performSelectorInBackground:@selector(run) withObject:nil];

上述2种创建线程方式的优缺点

  • 优点:简单快捷
  • 缺点:无法在线程创建时对线程进行更详细的设置,只能在run方法中进行设置,即获取当前线程对象进行设置。

3. 退出线程

退出线程的方式有cancle和exit方法

(1). 两者的区别:

  • 使用cancle方法退出线程,线程不会马上退出,会在某些线程堵塞的情况下退出,但也不一定,它的退出是未知的。
  • 使用exit方法退出线程,线程会强制马上退出,exit方法没有给线程清理自己并释放资源的时间,可能会造成资源泄露。

(2). 退出线程的做法:

  • 调用cancel方法,并把线程变量赋值为nil。
  • 也可以cancle和exit结合使用,使用cancle进行标记,使用exit退出。

4. NSThread的接口

@interface NSThread : NSObject  {
@private
    id _private;
    uint8_t _bytes[44];
}

// 获取当前线程
+ (NSThread *)currentThread;

// 创建新线程
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;

// 是否是多线程
+ (BOOL)isMultiThreaded;

/** 
*   每个线程都维护了一个“键-值”的字典,它可以在线程里面的任何地方被访问,
*   可以使用该字典来保存一些信息,这些信息在整个线程的执行过程中都保持不变。
*   比如,可以使用它来存储在整个线程过程中RunLoop里面多次迭代的状态信息。
*   使用:通过threadDictionary方法获取一个NSMutableDictionary对象,然后添加需要的字段和数据
*/
@property (readonly, retain) NSMutableDictionary *threadDictionary;

// 设置线程睡眠/堵塞
+ (void)sleepUntilDate:(NSDate *)date;

// 设置线程睡眠/堵塞
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

// 结束/退出进程
+ (void)exit;

// 获取线程的优先级
+ (double)threadPriority;

// 设置线程优先级,取值范围0.0~1.0
+ (BOOL)setThreadPriority:(double)p;

// 线程优先级,iOS8以后推荐使用qualityOfService属性,通过量化的优先级枚举值来设置
@property double threadPriority; 

/** 线程优先级
    qualityOfService的枚举值如下:
    NSQualityOfServiceUserInteractive:最高优先级,用于用户交互事件
    NSQualityOfServiceUserInitiated:次高优先级,用于用户需要马上执行的事件
    NSQualityOfServiceDefault:默认优先级,主线程和没有设置优先级的线程都默认为这个优先级
    NSQualityOfServiceUtility:普通优先级,用于普通任务
    NSQualityOfServiceBackground:最低优先级,用于不重要的任务
*/
@property NSQualityOfService qualityOfService;

// 返回当前线程在栈中所占的地址所组成的数组
+ (NSArray<NSNumber *> *)callStackReturnAddresses NS_AVAILABLE(10_5, 2_0);

// 返回栈空间的符号表
+ (NSArray<NSString *> *)callStackSymbols NS_AVAILABLE(10_6, 4_0);

// 线程名称
@property (nullable, copy) NSString *name NS_AVAILABLE(10_5, 2_0);

// 栈的所占空间大小
@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);

// 是否是主线程
@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0);

// 判断当前线程是否是主线程
+ (BOOL)isMainThread NS_AVAILABLE(10_5, 2_0); // reports whether current thread is main

// 获取主线程
+ (NSThread *)mainThread NS_AVAILABLE(10_5, 2_0);

// 初始化线程
- (instancetype)init NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;

// 初始化线程
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument NS_AVAILABLE(10_5, 2_0);

// 是否正在执行
@property (readonly, getter=isExecuting) BOOL executing NS_AVAILABLE(10_5, 2_0);

// 是否执行完毕
@property (readonly, getter=isFinished) BOOL finished NS_AVAILABLE(10_5, 2_0);

// 是否已经取消/中止
@property (readonly, getter=isCancelled) BOOL cancelled NS_AVAILABLE(10_5, 2_0);

// 取消线程,不能再开始
- (void)cancel NS_AVAILABLE(10_5, 2_0);

// 开始线程
- (void)start NS_AVAILABLE(10_5, 2_0);

/** main是线程入口
*  - (void)main的使用:
*  1. 一般创建线程会子类化NSThread,重写main方法,把关于线程执行的方法都写在里面,这样可以在任何需要这个线程方法的地方直接使用。
*  2. 把线程执行的方法写在main里,是因为线程的操作应该属于线程的本身,而不是每次使用都通过initWithTarget:selector:object:方法,且再一次实现某个方法。
*  3. 当重写了main方法后,同时使用initWithTarget:selector:object:方法初始化,调用某个方法执行任务,系统默认只执行main方法里面的任务。
*  4. 如果直接使用NSThread创建线程,线程内执行的方法都是在当前的类文件里面的。
*/
- (void)main NS_AVAILABLE(10_5, 2_0);

@end

5. 多线程的状态

计算机中的线程在内存中得可调度线程池中,每一条线程都有5个状态。

注意:一旦线程停止(死亡)了,就不能再次开启任务。

这里写图片描述

这里写图片描述


(1). 启动线程

// 进入就绪状态或直接进入运行状态。当线程任务执行完毕,自动进入死亡状态
- (void)start;

(2). 阻塞(暂停)线程

// 进入阻塞状态
// 堵塞到遥远未来,系统会自动杀死线程,[NSThread sleepUntilDate:[NSDate distantFuture]];
// 堵塞到遥远的过去,线程不会堵塞,[NSThread sleepUntilDate:[NSDate distantPast]];
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

(3). 强制停止线程

// 进入死亡状态
+ (void)exit;

6. 多线程的安全隐患

  • 线程同步:多条线程在同一条线上执行(按顺序地执行任务)
  • 互斥锁:就是使用了线程同步技术
(1). 资源共享 - 数据错乱

1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,比如多个线程访问同一个对象、同一个变量、同一个文件,当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题。

(2). 安全隐患解决 – 互斥锁
  • 互斥锁使用格式

    // 注意:锁定1份代码只用1把锁,用多把锁是无效的。
    @synchronized(锁对象) { // 需要锁定的代码 }

    提示: “锁对象”也被称为一个“信号量”。当一个线程要执行这段代码时,它会检查其他的线程是否也在访问“锁对象”,如果没有线程在访问“锁对象”,这块代码会被执行;否则这段线程会被限制访问直到这个互斥锁解除为止。

  • 互斥锁的优缺点:

    优点:能有效防止因多线程抢夺资源造成的数据安全问题
    缺点:需要消耗大量的CPU资源

  • 互斥锁的使用前提:多条线程抢夺同一块资源

补充: iOS中有两种加锁方式,即NSLock与NSCondition,之后又通过@synchronized替代了NSLock复杂的书写方式,确保线程同步。

(3). 原子和非原子属性
  • OC在定义属性时有nonatomic和atomic两种选择

    atomic:原子属性,为setter方法加锁(默认就是atomic)
    nonatomic:非原子属性,不会为setter方法加锁

  • nonatomic和atomic对比

    atomic:线程安全,需要消耗大量的资源
    nonatomic:非线程安全,适合内存小的移动设备

  • iOS开发的建议

    所有属性都声明为nonatomic,尽量避免多线程抢夺同一块资源,尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力。

7. 多线程的通信

(1). 什么叫做线程间通信

在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信

(2). 线程间通信的体现
  • 1个线程传递数据给另1个线程
  • 在1个线程中执行完特定任务后,转到另1个线程继续执行任务
(3). 线程间通信常用方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

(4). 以前常用线程通信

  • NSPort
  • NSMessagePort
  • NSMachPort

8. 线程的通信实例

实例:点击按钮,添加网络图片

注意:在Xcoed7后,使用dataWithContentsOfURL加载网络数据为出错

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

解决方法:是在Info.plist中添加参数

  • 在 Info.plist 中添加 NSAppTransportSecurity,类型为 Dictionary 。
  • 在 NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads, 类型为 Boolean,值设为 YES。

这里写图片描述

实例界面(加载图片后):
这里写图片描述

具体代码:

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (IBAction)btnClick:(id)sender {

    // 创建线程
    [NSThread detachNewThreadSelector:@selector(imageLoad) toTarget:self withObject:nil];

}

// 线程执行任务
- (void)imageLoad {

    // 从网络下载图片
    NSURL *url = [NSURL URLWithString:@"http://img.51ztzj.com/upload/image/20140618/sj201406181009_279x419.jpg"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];


    // 线程通信,子线程把image传给主线程
    // waitUntilDone:是否等主线程执行完setImage:后子线程才往下执行
//    [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];
//    [self performSelector:@selector(showImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];

    // setImage:是self.imageView属性image的setter方法
//    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
    [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];



    NSLog(@"---%s---",__func__);
}

- (void)showImage:(UIImage *)image {

    _imageView.image = image;

    NSLog(@"%s---%@",__func__,[NSThread currentThread]);
}

@end
基于YOLOv8的水果新鲜程度检测系统设计与实现 数据采集与预处理模块:负责收集水果图像数据并进行标注和增强深度学习模型:基于YOLOv8的目标检测模型新鲜度评估模块:根据检测结果评估水果新鲜程度用户界面:提供友好的交互界面系统集成:将各模块整合为完整系统水果新鲜程度检测需要包含多种水果在不同新鲜度状态下的图像数据集。:包含5种常见水果(苹果、香蕉、橙子、葡萄、草莓)在不同新鲜度下的图像包含约8,000张图像,分为新鲜和腐烂两类AgriVision:大型农业图像数据集,包含水果检测和分类任务Fruit-360:包含120种水果的高质量图像。 阅读详情

相关推荐

微腔光频梳仿真入门:MATLAB求解LLE方程全流程解析

光学频率梳在精密测量、光通信和微波光子学中有着广阔应用,而微环谐振腔中的Kerr非线性与四波混频效应能够紧凑地产生宽带梳齿。仿真这类系统的核心是求解Lugiato-Lefever方程(LLE),但直接从物理参数到数值代码往往让初学者无从下手。本文从微腔光频梳的物理图像出发,介绍LLE方程的推导与归一化方法,并重点讲解MATLAB数值实现的两种思路:基于ode45的频域耦合方程组求解与分裂步长RK4IP方法。同时讨论失谐扫描、孤子态识别、参数稳定性边界,以及如何将真实器件参数换算为无量纲仿真参数。无论你是刚接

weixin_32325225的博客 291

NSObject类别-NSThreadPerformAdditions

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array

qq_22808561的专栏 552

水文模型大合集---SWAT模型、VIC模型、HEC-HMS模型、HSPF模型、FVCOM模型、Delft3D模型、HYPE模型.......

1.1 面源污染概要1.2 SWAT模型及应用1.3 SWAT模型原理1.4 SWAT模型输入文件1.5 ArcGIS与SWAT关系。

jwwkyjspt的博客 4358

iOS中的 多线程- NSThread 与 NSObject

// 第一步: // 封装// Thread,主线程与 UI 挂钩 // 注意: // ***使用 NSThresd时候,在子线程中要自己加,@autoreleasepool, 不加会内存泄露(对象释放不了), 原因:autoreleasepool 影响一些autoreleasepool标签的对象释放, 但是,主线程已经加到自动释放池中了 - (void)objectCreate { -

qq_32780047的博客 501

金蝶ERP元数据解析:字段属性与表结构映射实战

本文深入解析金蝶ERP元数据的核心价值与应用实践,详细介绍了字段属性与表结构映射的关键技术。通过缓存获取与工具类直连两种方案对比,结合实际案例展示元数据在数据库校验、动态表单生成等场景的应用,帮助开发者高效解决二次开发中的常见问题。

weixin_33738555的博客 433

Visual studio 2013 配置 Halcon 13 (非抄袭)

Visual studio 2013 配置 Halcon 13.0.2.2 (其他版本适用) 针对网上抄袭的配置方法均不可用,写了一篇亲试可行的配制方法。如下: 1.下载Halcon安装后(C:\Program Files\MVTec\HALCON-13.0) 添加环境变量,(按下win按键,键入“环境变量”,出现 “编辑系统环境变量”后按下enter即可打开,下方找到“环境变量”按钮)的系...

huyanjackson的专栏 1040

jemalloc 深入分析 之 Tcache 实现原理

Tcache Tcache Tcache 实现原理 3.1. TSD:thread specific data 线程局部存储 pthread_setspecific(a_name##tsd_tsd, (void *)wrapper)) a_name##tsd_wrapper_t *wrapper = (a_name##tsd_wrapper_t *) \ pthread_getspecific...

ip5108的博客 3328

新能源汽车动力总成研发测试技术全景深度报告(2025版)

本文所有企业案例数据均来自上市公司财报、工信部备案信息及权威媒体报道,技术参数经第三方检测报告交叉验证。研发测试人员能力矩阵重构(T型人才进阶路径)[10] 全球动力总成市场2035年预测报告。[9] NI电动汽车HIL测试架构技术文档。[3] 东风汽车智能化研发体系深度报告。[5] 混合动力测功机发明专利技术细节。[1] 领克动力总成试验中心技术解析。[7] 新能源汽车产业迭代趋势白皮书。测试架构师-数字工程。测试架构师-安全合规。测试架构师-人工智能。

优快云-新能源汽车研发测试专业博主 776

jemalloc横向分析(一) 核心结构体

第一个结构体arena_s struct arena_s {     /* This arena's index within the arenas array. */     unsigned        ind;该结构在arenas数组中的索引     /*      * Number of threads currently assigned to this arena.

deusomax的专栏 1483

《UDS协议从入门到精通》系列——图解0x19:读取故障码信息

认识最核心的诊断服务“0x19”!!全网最强图解!一文搞懂所有常用子服务!

车载系统攻城狮 1万+

Unet++改进33:添加ConvolutionalGLU(2024最新改进方法)|紧凑的网络结构和高效的运算

由于残差连接的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉变形模型往往不能形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,在本文中,我们提出了聚合注意力,这是一种基于仿生设计的令牌混合器,它模拟生物中央凹视觉和连续眼运动,同时使特征映射上的每个令牌具有全局感知。此外,我们结合了可学习的令牌,与传统的查询和键交互,这进一步多样化了亲和矩阵的生成,而不仅仅依赖于查询和键之间的相似性。我们的方法不依赖于堆叠进行信息交换,从而有效地避免了深度退化,实现了自然的视觉感知。

AIcurator的博客 683

iOS 多线程知识体系构建(二):Pthreads、NSThread篇

本篇首先来学习 iOS 多线程技术中的 Pthreads 和 NSThread。⛽️⛽️ Pthreads 可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是 IEEE(电气和电子工程师协会)为要在各种 UNIX 操作系统上运行软件,而定义 API 的一系列互相关联的标准的总称,其正式称呼为 IEEE Std 1003,而国际标准名称为 ISO/IEC 9945。此标准源于一个大约开始于1985 年的项目。POSIX 这个名称是由理查.

henry_lei的博客 808

SerDes学习笔记:DFE均衡架构示例(USB3.1、PCIe3.0\4.0)

本文探讨了DFE均衡器架构在不同数据接口中的应用特性。研究表明,抽头数量随数据速率提升而增加,1-16抽头架构较为常见。通过PCIeGen3/4实例分析,对比了单抽头、双抽头和15抽头DFE的性能差异,证明多抽头结构能通过精细调节有效提升噪声容限和降低误码率。文章详细阐述了DFE工作原理,包括其通过反馈信号对输入信号的补偿机制,以及不同抽头对消除码间干扰的作用。实验采用8Gbps速率(125ps/UI)进行波形仿真,直观展示了均衡处理前后的信号变化,为理解信道均衡技术提供了重要参考。

一只豌豆象的博客 517

在iOS开发为什么使用多线程 ,多线程有哪些方法

多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的。 然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务。 概要提示: iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程

love android 899

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

iOS边城之多线程并发编程

参考:官方 OS X和iOS中的多线程技术 基本每门语言都有多线程这个技术点,多线程是为了实现并发执行,可以理解为一个系统进程是由一个或多个线程组成的。iOS中创建线程的方式简单到可以直接调用对象的方法来实现,下面我们来看看。   调用NSObject方法实现多线程 NSObject提供了以 performSelector为前缀的一系列方法。它允许用户在指定的线程、什么时间执行某个

mokai 2027

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

iOS——多线程编程详细解析

基本定义: 程序:由代码生成的可执行应用。(例如QQ.app) 进程:一个正在运行的程序可以看做是一个进程。 (例如:正在运行的QQ 就是一个进程),进程拥有独立运行所需要的全部资源。 线程: 程序中独立运行的代码段。(例如: 接收QQ 消息的代码) 一个进程是由一个或者多个线程组成。进程只负责资源的调度和分配,线程才是程序真正懂得执行单元,负责代码的执行。单线程 每个正在运行的程序(即进

ci915194561的专栏 1203

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Cocoa Touch(四): 多线程GCD, NSObject, NSThread, NSOperationQueue

多线程的重要性不必多言,现代操作系统不可能离开进程线程的抽象。具体到ios应用,我们只能在一个进程中管理线程,主线程不应该去执行非常耗时间的后台操作导致出现卡机现象,后台的事情交给后台线程来完成。 Grand Central Dispatch GCD组件包含两大部分,第一个部分是提供了C语言线程同步互斥接口,第二个部分就是dispatch队列。 dispatch bl...

197

iOS 开发 多线程详解之NSThread实现多线程

NSThread 实现多线程的技术方案之一. 面向对象的开发思想. 每个对象表示一条线程. 创建线程三种方式1.对象方法创建实例化线程对象的同时指定线程执行的方法@selector(demo:). 需要手动开启线程.- (void)threadDemo1 { NSThread *thread = [[NSThread alloc] initWithTarget:self selector:

高级软件开发工程师--周玉的博客 555

iOS多线程和runLoop介绍

一.线程概述 有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断。直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样;圆如操作系统,一直运行直到你关机。  一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。Mac和iOS中的程序启动,创建好一个进程的同时, 一个线程便开始运行,这个线程叫主

u012894362的专栏 652

iOS: NSObject中执行Selector的相关方法

本文转载至http://www.mgenware.com/blog/?p=463 1. 对当前Run Loop中Selector Sources的取消 NSObject中的performSelector:withObject:afterDelay:方法将会在当前线程的Run Loop中根据afterDelay参数创建一个Timer,如果没有调用有inModes参数的方法,...

a1311010193的博客 156

iOS基础--多线程简单总结(NSThread、NSOperation、NSOperationQueue))

原来一切都来不及 多线程.png 多线程概念 程序: 由源代码生成的可执行应用. 进程: 一个正在运行的程序可以看做一个进程. (例如: 正在运行的QQ就是一个进程) , 进程拥有独立运行所需的全部资源. 线程: 程序中独立运行的代码段. 注:一个进程是由一或多个线程组成. 进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行. ...

小超人的博客 171

多线程操作之NSObject

1. NSObject ()   一个多线程操作的分类      NSObject 多线程 分类里面的方法, 在后面子线程中执行一个操作      本质是: 帮我们快速创建了一个子线程。把相关操作放到了子线程中执行。            两个方法:      (1) 开启后台执行任务的方法:     [self performSelectorInBackground:@selec

ihavenobody的博客 373

IOS中的多线程和NSRunLoop概述(转载)

线程概述   有些程序是一条直线,从起点到终点,如Hello World,运行打印完,它的生命周期便结束了;有些程序是一个圆,不断循环,直到将它切断,如操作系统,一直运行直到你关机。  一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。Mac和iOS中的程序启动,创建好一个进程的同时, 一个线程便开始运行,这个线程叫主线程。主线程在程序中的地位和其他...

weixin_34278190的博客 947

iOS多线程编程(二)------ NSThread

iOS多线程开发一 使用NSThread 因为这个在实际开发项目中用的不多,所以会简单使用就好一、NSThread(显示创建线程) 有两种方式创建线程,在主线程中更新UI,只能传一个参数,停止线程调用exist方法 1.类方法 +(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argu

建古的编码生活 414

iOS多线程的初步研究(一)-- NSThread

对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用。产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用。 一、显示调用的类为NSThread。一般构造NSThread的线程对象可通过两种方式: 1. 初始化线程主方法: [NSThread detachNewThreadSelector:@selector(run:) toTarget:tar

bravegogo的专栏 369

【iOS多线程】Mac&iOS之多线程

【iOS多线程】Mac&iOS之多线程 分类: 【MAC/IOS下开发】 2013-11-20 14:36 770人阅读 评论(0) 收藏 举报 MaciOS多线程 目录(?)[+] 一线程概述二创建线程 使用NSThread使用NSObjectPOSIX Thread 三多线程进阶 NSOperationNSOperationQueueGC

ffblog的专栏 740
上一篇: 精心整理的操作系统相关概念
下一篇: iOS多线程总结(2)——GCD的使用
活在生活里
博客等级 码龄11年 94粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值