源码阅读-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 ...
随机推荐
- 洛谷 P4841 城市规划
构造简单无向图的EGF: \[ G(x)=\sum_{i}^{\infty}2^{\binom{i}{2}}\cdot\frac{x^i}{i!} \] 构造简单无向连通图的EGF: \[ F(x)= ...
- Inno Setup添加中文安装语言文件
如果你不添加中文安装语言文件,你编译生成的安装包的语言是不会有中文. 一,打开软件安装目录下的Languages文件夹下,有如下好多文件,可是就是没有Chianese.isl. 好了,你只需要随便拷贝 ...
- mvc项目中Controller执行完毕重定向到html的一个页面中
String ip = request.getLocalAddr(); //取得服务器IP int port = request.getLocalPort(); //取得服务器端口 String ur ...
- 算法的泛化过程(摘自《STL源码剖析》)
将一个叙述完整的算法转化为程序代码,不是什么难事.然而,如何将算法独立与其所处理的数据结构之外,不受数据结构的羁绊呢?换个说法,如何将我们所写的程序算法适用于任何(或者大部分)未知的数据结构(比如ar ...
- gem install redis安装时报错:redis requires Ruby version >= 2.2.2
Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2 解决办法是 先安装rvm,再把ruby版本提升至2.3.3 1.安装curl sudo yum install ...
- 【.net开发者自学java系列】使用Eclipse开发SpringMVC(1)
第一篇随笔,有点紧张.有错别字是正常的.... 好了,自我描述下.我是一个有几年.net开发经验的老菜鸟.是的,老菜鸟.别跟我讨论底层,别跟我讨论协议.TMD啥都不会. 为什么要学JAVA,我也不想, ...
- node里使用supervisor
1.npm -g install supervisor(安装) 2.用cd命令定位到项目的根目录 3.supervisor bin/www
- activemq的高级特性:消息的可靠性
高级特性之消息的可靠性 可靠性分为:生产者.消费者.生产者必须让mq收到消息,消费者必须能够接收到消息并且消费成功,这就是消息的可靠性. 1:生产者可靠性 Session session = conn ...
- PHP程序员的技术成长规划 第一阶段:基础阶段
第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作)目标:能够完成基本的LNMP系统安装,简单配置维护:能够用PHP源码做基本的简单系统的PHP开发:能够在PHP中 ...
- 100-Days-Of-ML-Code 评注版(Day 3)
Day3_Multiple_Linear_Regression(多元线性回归) 本文引用自 Multiple_Linear_Regression, 对其中内容进行了评注与补充说明. 回归分析是一种预测 ...