PostgreSQL中使用spinlock来对资源进行加锁。TAS lock是最简单的spinlock。当然spinlock可以用信号量来实现。但是据PostgreSQL的早期报告显示,内核提供的信号量将大大降低性能。所以学习TAS lock对我们提高软件性能是大有帮助的。
TAS就是Test And Set。它要做的就是跟一个变量进行Test。如果条件满足对其Set另外一个值,如果条件不满足,就继续等待。但是所有这些都是原子操作。
Windows提供了一个API:InterlockedCompareExchange。PostgreSQL的Windows版本就是利用它来实现TAS的。
下面的Demo就是看看这个API是怎么用的。
PostgreSQL是如何定义TAS的呢?
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))