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))

你可能感兴趣的:(C++,c,windows,C#,PostgreSQL)