avatar
paper help please# Biology - 生物学
q*x
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);
avatar
p*2
3
test_and_set 难道不会返回0?
avatar
q*x
5
怎么返回0?

【在 p*****2 的大作中提到】
: test_and_set 难道不会返回0?
avatar
d*3
6
多谢呀!!!!
avatar
p*2
7
里面不是讲了吗?
test-and-set可以给一个内存赋值,然后返回老值。
初始的时候,内存是0,所以第一个caller会把它变为1,但是返回值是0,所以就lock
了。后续的caller都会得到返回值1,所以就必须wait, 也就是那个while loop. 当第
一个caller unlock之后, 内存又变为0, 其他的caller就可以lock了。
avatar
q*x
8
怎么unlock?

lock

【在 p*****2 的大作中提到】
: 里面不是讲了吗?
: test-and-set可以给一个内存赋值,然后返回老值。
: 初始的时候,内存是0,所以第一个caller会把它变为1,但是返回值是0,所以就lock
: 了。后续的caller都会得到返回值1,所以就必须wait, 也就是那个while loop. 当第
: 一个caller unlock之后, 内存又变为0, 其他的caller就可以lock了。

avatar
p*2
9

unlock就把内存赋0就可以了。

【在 q****x 的大作中提到】
: 怎么unlock?
:
: lock

avatar
q*x
10
不用test-and-set?code怎么写?
另外死循环不是忙等待吗?应该是 if吧?
if (test_and_set(lock)) sleep();

【在 p*****2 的大作中提到】
:
: unlock就把内存赋0就可以了。

avatar
p*2
11
看这段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();
这个不行呀。你睡着了,什么时候醒过来呀?
avatar
q*x
12
unlock的线程发信号给OS,OS唤醒队列里第一个啊。

【在 p*****2 的大作中提到】
: 看这段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();

avatar
p*2
13

unlock不会发信号的。只是改内存。
线程sleep, 也不会因为这个自动唤醒呀。有这个机制吗?
lock本身就是竞争机制吧?没有说是按队列排序的。

【在 q****x 的大作中提到】
: unlock的线程发信号给OS,OS唤醒队列里第一个啊。
avatar
p*2
14
你看看这段代码就清楚了。
; 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.
avatar
H*y
15
spinlock就是忙等待

【在 q****x 的大作中提到】
: 不用test-and-set?code怎么写?
: 另外死循环不是忙等待吗?应该是 if吧?
: if (test_and_set(lock)) sleep();

avatar
s*e
16
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 的大作中提到】
: 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);

avatar
q*x
17
cool. but i only see two posts there...

【在 s*****e 的大作中提到】
: 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/

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。