自旋锁的实现
test-and-set
代码:
typedef struct lock_t {
int flag;
}lock_t;
void init(lock_t *mutex){
mutex->flag = 0;
}
void lock(lock_t *mutex){
while(mutex->flag == 1);
mutex->flag = 1;
}
void unlock(lock_t *mutex){
mutex->flag = 0;
}
有限状态机模型:
compare-and-exchange(x86)
SPARC系统是compare-and-swap
代码:
int CompareAndSwap(int *ptr, int expected, int new){
int actual;
if(actual == expected){
*ptr = new;
}
return actual;
}
void lock(lock_t *lock){
while(CompareAndSwap(lock->flag, 0, 1) == 1);
}
LL/SC(load-linked/store-conditional)
int LoadLinked(int *ptr){
return *ptr;
}
int StoreConditional(int *ptr, int value){
if(no one has update *ptr since the LoadLinked to this address){
*ptr = value;
return 1;
}else{
return 0;
}
}
void lock(lock_t *lock){
while(1){
while(LoadLink(&lock->flag) == 1);
if(StoreConditional(&lock->flag, 1) == 1) return;
}
}
void unlock(lock_t *lock){
lock->flag = 0;
}
fetch-and-add
代码:
int FetchAndAdd(int *ptr){
int old = *ptr;
*ptr = old + 1;
return old;
}
typedef struct lock_t{
int ticket;
int turn;
}lock_t;
void lock_init(lock_t *lock){
lock->ticket = 0;
lock->turn = 0;
}
void lock(lock_t *lock){
int myturn = FetchAndAdd(&lock->ticket);
while(lock->turn != myturn);
}
void unlock(lock_t *lock){
FetchAndAdd(lock->turn);
}