源码阅读-GlobalTimer
最近看到一篇文章推了一个开源项目,GlobalTimer。主要是可以用一个定时器来统一管理多个定时任务,可以针对特定任务进行管理。
一、原理
1.一个公共的timer
2.封装任务到自定义个Event中,保留任务的执行代码与数据,时间信息等
3.计算所有任务间隔的最大公约数x,用这个x作为timer的触发间隔
4.timer触发时,遍历所有任务,看是否到了执行间隔来决定是否执行
二、记录点
1.最大公约数与最小公倍数计算公式
// 最大公约数
int gcd(int a, int b)
{
if (a == 0)
return b;
return gcd(b%a, a);
}
// 最小公倍数
int lcm(int a, int b)
{
if (a == 0)
return b;
return a*b/gcd(b%a, a);
}
2.Lock宏
#define LOCK(...) dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); \
__VA_ARGS__; \
dispatch_semaphore_signal(_lock);
不过建议改成这样
#define LOCK(lock,...) do { \
dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); \
__VA_ARGS__; \
dispatch_semaphore_signal(lock); \
} while (0);
3.OSAtomic
类型 | |
---|---|
内存屏障 | OSMemoryBarrier() |
自旋锁 | OSSpinLockLock , OSSpinLockTry , OSSpinLockUnlock |
原子队列操作 | FIFO:OSAtomicFifoDequeue 和OSAtomicFifoEnqueue LIFO:OSAtomicDequeue和OSAtomicEnqueue |
比较和交换 | OSAtomicCompareAndSwap**[Barrier] 如果是旧值,就替换,否则不变OSAtomicTestAndClear/OSAtomicTestAndClearBarrier 置0OSAtomicTestAndSet/OSAtomicTestAndSetBarrier 置1 |
布尔操作(AND, OR, XOR) | OSAtomicAnd32 , OSAtomicAnd32Barrier , OSAtomicAnd32Orig , OSAtomicAnd32OrigBarrier |
数学操作 | 加操作:OSAtomicAdd** , OSAtomicAdd**Barrier 递减操作: OSAtomicDecrement** , OSAtomicDecrement**Barrier 递增操作: OSAtomicIncrement** , OSAtomicIncrement**Barrier |
三、其他
相关吐槽其实已经提了issue,看到最后发现他的代码参考了不少MSWeakTimer的代码。
参考:
1.http://southpeak.github.io/2014/10/17/osatomic-operation/
2.http://blog.csdn.net/tuxiangqi/article/details/8076972
源码阅读-GlobalTimer的更多相关文章
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 【原】AFNetworking源码阅读(五)
[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 【原】AFNetworking源码阅读(二)
[原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...
- 【原】AFNetworking源码阅读(一)
[原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...
随机推荐
- 基于LNMP的小米电子商务网站平台
项目参考:http://www.cnblogs.com/along21/p/7822228.html 基于LNMP的小米电子商务网站平台 1.环境 setenforce 0 #关闭selinux sy ...
- urlparse 用法
ifrom urllib2 import urlparse ‘’ captcha_id = urlparse.parse_qs(urlparse.urlparse(link).query, True) ...
- python执行linux和window的命令
linux: python执行shell脚本常用的方法 import os val=os.system("shell语句") >>> val=os.system ...
- [转]JS Cookie 中文乱码
首先是一个解析cookie的函数: <script type="text/javascript"> function getCookie(name) { var c ...
- Gradle Goodness: Renaming Files while Copying
With the Gradle copy task we can define renaming rules for the files that are copied. We use the ren ...
- freemark生成静态网页乱码问题
输出流问题:修改Writer如下: OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(dir), &quo ...
- WAPM环境配置(PHP入门2)
WAMP介绍 W:Window:开源免费 A:Apache:开源免费 M:MySQL:开源免费 P:PHP:开源免费 Apache下载 Apache下载地址:https://www.apachehau ...
- JS知识点整理(二)
前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...
- JAVA 8 新特性 __ Optional 类
Optional 类是一个可以作为null容器的对象,若值存在调用isPresent()就返回 true,调用get()会返回该对象. Optional是一个容器,可以保存类型T的值,或者仅仅保存nu ...
- Extjs6 怎么重写框架的类
创建一个覆写(override)类的推荐方法如下: Ext.define('MyApp.overrides.panel.Panel', { override: 'Ext.panel.Panel', c ...