• 源码阅读-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: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

  • 相关阅读:
    2018 我要告诉你的 Vue 知识大全
    探究Javascript模板引擎mustache.js使用方法
    高性能JavaScript模板引擎实现原理详解
    junit报错
    http报文
    web应用和http协议
    eclipse首次使用基本设置
    利用亚马逊AWS搭建个人服务器
    图文详解 IntelliJ IDEA 15 创建普通 Java Web 项目
    MyEclipse 设置条件断点
  • 原文地址:https://www.cnblogs.com/v2m_/p/8591231.html
Copyright © 2020-2023  润新知