- 论坛徽章:
- 11
|
不错, 前不久实现了一个类似的, 但很显然性能低些, 主要是不知道 __sync_bool_compare_and_swap() 这个函数, 呵呵。
另外, 楼主似乎不必使用volatile变量吧, 因为while循环中传入的本来就是指针, 即便cache, cache 的也是指针本身而不是指向的值。
static inline void lock(int* lk){
int n;
LABEL:
n = __sync_add_and_fetch(lk, 1);
if(n != 1){
__sync_sub_and_fetch(lk, 1);
sched_yield();
goto LABEL;
}
}
static inline int try_lock(int* lk){
int n;
LABEL:
n = __sync_add_and_fetch(lk, 1);
if(n != 1){
__sync_sub_and_fetch(lk, 1);
return -1;
}
return 0;
}
static inline void unlock(int* lk){
__sync_sub_and_fetch(lk, 1);
} |
|