本文共 2863 字,大约阅读时间需要 9 分钟。
锁是并发实现的必要机制,计算机体系结构的指令集内有不同的硬件原语,可以实现锁机制。评价锁实现的效果有三个标准:
锁的实现有以下几种方式:
控制中断是最早的互斥解决方案之一,即在临界区关闭中断,保持线程对临界区的持续访问,该方案是为单处理器系统开发的。
typedef struct lock_t { int flag; } lock_t;void init(lock_t *mutex) { // 0 -> lock is available, 1 -> held mutex->flag = 0;}void lock(lock_t *mutex) { while (mutex->flag == 1) // TEST the flag ; // spin-wait (do nothing) mutex->flag = 1; // now SET it!}void unlock(lock_t *mutex) { mutex->flag = 0;}
int TestAndSet(int *ptr, int new) { int old = *ptr; // fetch old value at ptr *ptr = new; // store ’new’ into ptr return old; // return the old value}
typedef struct __lock_t { int flag;} lock_t;void init(lock_t *lock) { // 0 indicates that lock is available, 1 that it is held lock->flag = 0;}void lock(lock_t *lock) { while (TestAndSet(&lock->flag, 1) == 1) ; // spin-wait (do nothing)}void unlock(lock_t *lock) { lock->flag = 0;}
//比较并交换指令的一般形式int CompareAndSwap(int *ptr, int expected, int new) { int actual = *ptr; if (actual == expected) *ptr = new; return actual;}
只需要用下列code替代lock函数即可
void lock(lock_t *lock) { while (CompareAndSwap(&lock->flag, 0, 1) == 1) ; // spin}
int LoadLinked(int *ptr) { return *ptr;}int StoreConditional(int *ptr, int value) { if (no one has updated *ptr since the LoadLinked to this address) { *ptr = value; return 1; // success!} else { return 0; // failed to update}}
void lock(lock_t *lock) { while (1) { while (LoadLinked(&lock->flag) == 1) ; // spin until it’s zero if (StoreConditional(&lock->flag, 1) == 1) return; // if set-it-to-1 was a success: all done // otherwise: try it all over again }}void unlock(lock_t *lock) { lock->flag = 0;}
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) ; // spin}void unlock(lock_t *lock) { FetchAndAdd(&lock->turn);}
必须显示提供某种控制机制,决定释放锁,以及那个线程能够抢到锁
使用队列放置不能获取锁的线程,并让出cpu转载地址:http://fzksi.baihongyu.com/