q****x 发帖数: 7404 | 1 wiki没看懂。给的例子不是死循环吗?
void lock(bool *lock) {
while (test_and_set (lock) == 1);
}
比如下面的代码怎么映射到汇编里的test-and-set?
pthread_mutex_lock_t xlock;
pthread_mutex_lock(&xlock);
pthread_mutex_unlock(&xlock); |
p*****2 发帖数: 21240 | |
q****x 发帖数: 7404 | 3 怎么返回0?
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : test_and_set 难道不会返回0?
|
p*****2 发帖数: 21240 | 4 里面不是讲了吗?
test-and-set可以给一个内存赋值,然后返回老值。
初始的时候,内存是0,所以第一个caller会把它变为1,但是返回值是0,所以就lock
了。后续的caller都会得到返回值1,所以就必须wait, 也就是那个while loop. 当第
一个caller unlock之后, 内存又变为0, 其他的caller就可以lock了。 |
q****x 发帖数: 7404 | 5 怎么unlock?
lock
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 里面不是讲了吗? : test-and-set可以给一个内存赋值,然后返回老值。 : 初始的时候,内存是0,所以第一个caller会把它变为1,但是返回值是0,所以就lock : 了。后续的caller都会得到返回值1,所以就必须wait, 也就是那个while loop. 当第 : 一个caller unlock之后, 内存又变为0, 其他的caller就可以lock了。
|
p*****2 发帖数: 21240 | 6
unlock就把内存赋0就可以了。
【在 q****x 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 怎么unlock? : : lock
|
q****x 发帖数: 7404 | 7 不用test-and-set?code怎么写?
另外死循环不是忙等待吗?应该是 if吧?
if (test_and_set(lock)) sleep();
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : unlock就把内存赋0就可以了。
|
p*****2 发帖数: 21240 | 8 看这段code
#define LOCKED 1
int TestAndSet(int* lockPtr) {
int oldValue;
oldValue = SwapAtomic(lockPtr, LOCKED);
return oldValue == LOCKED;
}
这段code赋1了,unlock赋0就可以了。
SwapAtomic(lockPtr, 0)
if (test_and_set(lock)) sleep();
这个不行呀。你睡着了,什么时候醒过来呀? |
q****x 发帖数: 7404 | 9 unlock的线程发信号给OS,OS唤醒队列里第一个啊。
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 看这段code : #define LOCKED 1 : int TestAndSet(int* lockPtr) { : int oldValue; : oldValue = SwapAtomic(lockPtr, LOCKED); : return oldValue == LOCKED; : } : 这段code赋1了,unlock赋0就可以了。 : SwapAtomic(lockPtr, 0) : if (test_and_set(lock)) sleep();
|
p*****2 发帖数: 21240 | 10
unlock不会发信号的。只是改内存。
线程sleep, 也不会因为这个自动唤醒呀。有这个机制吗?
lock本身就是竞争机制吧?没有说是按队列排序的。
【在 q****x 的大作中提到】![](/moin_static193/solenoid/img/up.png) : unlock的线程发信号给OS,OS唤醒队列里第一个啊。
|
p*****2 发帖数: 21240 | 11 你看看这段代码就清楚了。
; Intel syntax
lock: ; The lock variable. 1 = locked, 0 = unlocked.
dd 0
spin_lock:
mov eax, 1 ; Set the EAX register to 1.
xchg eax, [lock] ; Atomically swap the EAX register with
; the lock variable.
; This will always store 1 to the lock, leaving
; previous value in the EAX register.
test eax, eax ; Test EAX with itself. Among other things,
this will
; set the processor's Zero Flag if EAX is 0.
; If EAX is 0, then the lock was unlocked and
; we just locked it.
; Otherwise, EAX is 1 and we didn't acquire the
lock.
jnz spin_lock ; Jump back to the XCHG instruction if the Zero
Flag is
; not set; the lock was previously locked, and
so
; we need to spin until it becomes unlocked.
ret ; The lock has been acquired, return to the
calling
; function.
spin_unlock:
mov eax, 0 ; Set the EAX register to 0.
xchg eax, [lock] ; Atomically swap the EAX register with
; the lock variable.
ret ; The lock has been released. |
H***y 发帖数: 42 | 12 spinlock就是忙等待
【在 q****x 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 不用test-and-set?code怎么写? : 另外死循环不是忙等待吗?应该是 if吧? : if (test_and_set(lock)) sleep();
|
s*****e 发帖数: 33 | 13 test_and_set() are mainly used to implement user space spin locks, and is
a very efficient way to avoid pthread_mutex, which is a kernel level lock,
quite expensive.
Check this post for why kernel level lock does not fit in some low latency
programming:
http://streetprogrammer.blogspot.com/
【在 q****x 的大作中提到】![](/moin_static193/solenoid/img/up.png) : wiki没看懂。给的例子不是死循环吗? : void lock(bool *lock) { : while (test_and_set (lock) == 1); : } : 比如下面的代码怎么映射到汇编里的test-and-set? : pthread_mutex_lock_t xlock; : pthread_mutex_lock(&xlock); : pthread_mutex_unlock(&xlock);
|
q****x 发帖数: 7404 | 14 cool. but i only see two posts there...
【在 s*****e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : test_and_set() are mainly used to implement user space spin locks, and is : a very efficient way to avoid pthread_mutex, which is a kernel level lock, : quite expensive. : Check this post for why kernel level lock does not fit in some low latency : programming: : http://streetprogrammer.blogspot.com/
|