最近看到一篇文章推了一个开源项目,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:OSAtomicFifoDequeueOSAtomicFifoEnqueue
LIFO:OSAtomicDequeue和OSAtomicEnqueue
比较和交换 OSAtomicCompareAndSwap**[Barrier]如果是旧值,就替换,否则不变
OSAtomicTestAndClear/OSAtomicTestAndClearBarrier置0
OSAtomicTestAndSet/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的更多相关文章

  1. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  2. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  3. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  4. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  5. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  6. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  7. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  8. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  9. 【原】AFNetworking源码阅读(一)

    [原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...

随机推荐

  1. 在Django中使用Q()对象

    转载于:  http://www.smallerpig.com/1000.html 问题 一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码: >>& ...

  2. bzoj 3339 Rmq Problem / mex

    题目 我的树状数组怎么那么慢啊 就是一道水题,我们考虑一下对于一个区间\([l,r]\)什么样的数能被计算 显然需要对于一个\(j\),需要满足\(j<l\)且\(nxt_{j}>r\), ...

  3. 【[NOI2011]阿狸的打字机】

    首先发现这个插入的非常有特点,我们可以直接利用这个特殊的性质在\(Trie\)树上模拟指针的进退 之后得到了\(Trie\)树,先无脑建出\(AC\)机 之后考虑一下如何写暴力 最简单的暴力对于每一个 ...

  4. G、CSL 的训练计划【BFS 贪心】(“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551/G 链接:https://ac.nowcoder.com/acm/contest/551/G来源:牛客网 题 ...

  5. SpringBoot实战(五)之Thymeleaf

    Thymeleaf同jsp.volocity.freemarker等共同的职能是MVC模式中的视图展示层,即View. 当然了,SpringBoot中也可以用jsp,不过不推荐这种用法,比较推崇的就是 ...

  6. docker参数

    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, - ...

  7. Blocking Master Example QT 自带 的 serial 即 串口 例子

    1.官方解释文档:http://doc.qt.io/qt-5/qtserialport-blockingmaster-example.html Blocking Master shows how to ...

  8. 歌词解析&class

    class song_song: def __init__(self,lrc_file): # 定义两个字典一个列表备用 self.song_file = lrc_file self.song_lrc ...

  9. code#5 P2 棋子

    棋子   时间限制: 1.0 秒 空间限制: 512 MB 相关文件: 题目目录 题目描述 棋盘从左到右被分割成 n(n≤1000) 个格子,从左到右编号为1,2,...,n.棋盘上有 m(m≤n)  ...

  10. MySQL常用:Got a packet bigger than 'max_allowed_packet' bytes & MySQL开远程服务

    1. 数据导入时出现错误 Got a packet bigger than 'max_allowed_packet' bytes 通过终端进入mysql控制台 mysql>show VARIAB ...