自旋锁的实现

自旋锁的实现

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值