zoukankan      html  css  js  c++  java
  • 源码阅读-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

  • 相关阅读:
    AI ResNet V1
    Lua基础
    git命令小结
    定时器及时间轮
    expect
    vscode 常用快捷键
    动态链接库与共享内存:
    container_of机制
    ELF文件格式
    git学习补充
  • 原文地址:https://www.cnblogs.com/v2m_/p/8591231.html
Copyright © 2011-2022 走看看