Aoogoo 发表于 2013-1-30 01:35:18

Postgresql源码中spinlock的基础:TAS

PostgreSQL中使用spinlock来对资源进行加锁。TAS lock是最简单的spinlock。当然spinlock可以用信号量来实现。但是据PostgreSQL的早期报告显示,内核提供的信号量将大大降低性能。所以学习TAS lock对我们提高软件性能是大有帮助的。
TAS就是Test And Set。它要做的就是跟一个变量进行Test。如果条件满足对其Set另外一个值,如果条件不满足,就继续等待。但是所有这些都是原子操作。
void spin_lock(lock){while(test_and_set(lock,true))   ;}void spin_unlock(lock){atomic_set(lock,false);}
Windows提供了一个API:InterlockedCompareExchange。PostgreSQL的Windows版本就是利用它来实现TAS的。
下面的Demo就是看看这个API是怎么用的。
#include <windows.h>#include <iostream>using namespace std;void main(){LONG source = 1;cout<<"before: "<<source<<endl;for(;;){if(1==InterlockedCompareExchange(&source,2,1)){break;}}cout<<"after: "<<source<<endl;}
PostgreSQL是如何定义TAS的呢?
typedef LONG slock_t;#define TAS(lock) (InterlockedCompareExchange(lock, 1, 0))
页: [1]
查看完整版本: Postgresql源码中spinlock的基础:TAS