2.GCD多线程整理

本文深入探讨了GCD(Grand Central Dispatch)的核心概念和技术细节,包括任务队列的创建、使用及管理,不同类型的队列及其适用场景,以及如何利用GCD实现线程间的同步与异步通信。

说明:该文整理自《Object-C高级编程》

1.任务队列

Dispatch Queue:FIFO结构的任务队列,等待线程处理,分成串行和并行两种模式。串行为单线程(同时被处理的任务只能有一个),并行为多线程,可以有多个任务被同时处理。

用户职能操作队列,而不能操作线程。

貌似并没有提供限制最大线程数量接口API。

serial dispatch queue:用在多个线程想更新相同的数据资源,这种方式能确保数据的安全

concurrent dispatch queue:不发生数据竞争的时,可以使用并行的队列 

 

2.API列表

//默认为串行队列

1.创建队列

dispatch_queue_t queid = dispatch_queue_create(“cc.app”, NULL);

DISPATCH_QUEUE_CONCURRENT 并行


2.释放队列(需手动释放,ARC并不负责队列释放)

dispatch_release(quid);

3.持有队列

dispatch_retain(queid); 

4.异步提交任务

dispatch_async(queid,^{…});

特别说明:异步提交的时候会隐式的调用dispatch_retain,确保队列可靠,被其它对象给释放

流程:

dispatch_create();

dispatch_async();

dispatch_release(); //提交后立即释放,也能确保任务能够被处理


进程的主线程队列和系统全局队列

5.获取主线程队列

dispatch_get_main_queue

6.获取全局队列

全局队列为并行队列有四种优先级:

DISPATCH_QUEUE_PRIORITY_LOW

DISPATCH_QUEUE_PRIORITY_DEFAULT

DISPATCH_QUEUE_PRIORITY_HIGH

DISPATCH_QUEUE_PRIORITY_BACKGROUND 

dispatch_get_global_queue

7.修改队列优先级

dispatch_set_target_queue

默认优先级为DISPATCH_QUEUE_PRIORITY_DEFAULT

可以修改queue的执行阶层

如果在多个serial queue中调用dispatch_set_target_queue,并且目标queue相同,那么这个时候原本本应并行执行的多个queue在目标中职能一次执行一个 ,由并行转串行,有没有先后顺序呢?


优先级设置方式ex:

dispatch_queue_t queid;

dispatch_queue_t global_que = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, NULL);

dispatch_set_target_queue(queid, global_que);

8.在指定多少时间后添加任务

dispatch_after

ex:3秒后追加到任务队列中

dispatch_time_t ntime = dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_SEC);

dispatch_after(time, dispatch_get_main_queue, ^{});

NSEC_PER_SEC 单位为秒

NSEC_PER_MSEC 单位为毫秒

 

dispatch_walltime 计算绝对时间,添加到指定队列


9.Dispatch group

等待一组任务完成后,通知,然后继续执行

dispatch_group_create 创建一个任务组

dispatch_group_async 向这个组提交任务

dispatch_group_notify 任务做完后通知

dispatch_group_wait 阻塞当前线程,进行阻塞

dispatch_release 释放

ex:

dispatch_queue_t queid = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, quid, ^{});

dispatch_group_async(group, quid, ^{});

dispatch_group_async(group, quid, ^{});

//任务做完后进行通知

dispatch_group_notify(group, dispatch_get_main_queue(), ^{});

dispatch_release(group);

//等待用法,返回为0表示任务都结束,否则未结束

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);


10.Dispatch Barrier

很强大的功能,有点类似读写锁,但由于读写锁(不会有饿死现象)

ex:

dispatch_async(queue, block0);

dispatch_async(queue, block1);

dispatch_async(queue, block2);

dispatch_async(queue, block3);

dispatch_barrier_async(queue, block_block);

dispatch_async(queue, block4);

dispatch_async(queue, block5);

dispatch_async(queue, block6);

状态分析:block0, block1, block2结束后,运行block_block

  然后并行运行block4, block5, block6

 

11.同步提交

dispatch_sync:同步提交任务,注意死锁

ex:如果以下代码在主线中运行则会死锁

dispatch_queue_t queid = dispatch_get_main_queue();

dispatch_sync(queid, ^{}); 

即:程在执行的时候会锁定自己的任务队列,当它自己向自己提交任务时,会进行再次加锁,这个时候就会造成死锁。

所以线程千万不要自己向自己提交任务,或者直接用异步方式也挺好


12.dispatch_apply按照指定的次数提交到任务队列,会等待任务结束


13.dispatch_suspend/dispatch_resume挂起或者唤醒队列,已经执行的任务不会停止


14.GCD方式的信号量

dispatch_semaphore_t semt = dispatch_semaphore_create(1);

dispatch_semaphore_wait(semt, DISPATCH_TIME_FORVER);  //返回值为0,获取了资源,否则超时

dispatch_semaphore_signal(semt);

dispatch_release(setmt);

15.dispatch_once 只执行一次初始化

static dispatch_once_t pred;

dispatch_once(&pred, ^{});

通过数据类型dispatch_once_t来进行保证

16.Dispatch IO

Page167,Page172,通过IO事件来进行驱动 

潮汐研究作为海洋科学的关键分支,融合了物理海洋学、地理信息系统及水利工程等多领域知识。TMD2.05.zip是一套基于MATLAB环境开发的潮汐专用分析工具集,为科研人员与工程实践者提供系统化的潮汐建模与计算支持。该工具箱通过模块化设计实现了两大核心功能: 在交互界面设计方面,工具箱构建了图形化操作环境,有效降低了非专业用户的操作门槛。通过预设参数输入模块(涵盖地理坐标、时间序列、测站数据等),用户可自主配置模型运行条件。界面集成数据加载、参数调整、可视化呈现及流程控制等标准化组件,将复杂的数值运算过程转化为可交互的操作流程。 在潮汐预测模块中,工具箱整合了谐波分解法与潮流要素解析法等数学模型。这些算法能够解构潮汐观测数据,识别关键影响要素(包括K1、O1、M2等核心分潮),并生成不同时间尺度的潮汐预报。基于这些模型,研究者可精准推算特定海域的潮位变化周期与振幅特征,为海洋工程建设、港湾规划设计及海洋生态研究提供定量依据。 该工具集在实践中的应用方向包括: - **潮汐动力解析**:通过多站点观测数据比对,揭示区域主导潮汐成分的时空分布规律 - **数值模型构建**:基于历史观测序列建立潮汐动力学模型,实现潮汐现象的数字化重构与预测 - **工程影响量化**:在海岸开发项目中评估人工构筑物对自然潮汐节律的扰动效应 - **极端事件模拟**:建立风暴潮与天文潮耦合模型,提升海洋灾害预警的时空精度 工具箱以"TMD"为主程序包,内含完整的函数库与示例脚本。用户部署后可通过MATLAB平台调用相关模块,参照技术文档完成全流程操作。这套工具集将专业计算能力与人性化操作界面有机结合,形成了从数据输入到成果输出的完整研究链条,显著提升了潮汐研究的工程适用性与科研效率。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值