最近看到一篇文章推了一個開源項目, "GlobalTimer" 。主要是可以用一個定時器來統一管理多個定時任務,可以針對特定任務進行管理。 一、原理 1.一個公共的timer 2.封裝任務到自定義個Event中,保留任務的執行代碼與數據,時間信息等 3.計算所有任務間隔的最大公約數x,用這個x作為t ...
最近看到一篇文章推了一個開源項目,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