由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 谁给讲讲test-and-set怎么实现mutex?
相关主题
请教大牛用mutex lock实现reader writer lock大家都是怎么学习mutex, lock, signal等等的?
请问C++ threading w/ lock free algorithms求教一个今天被面到的多线程的问题
embedded Linux ,面试了几次,都问这个问题了。不知道答案??人生中第一次面试
怎么才是 精简,准确呢? spinlock VS semaphore 的 区别??Google 电面面经
菜鸟请教多线程怎么学某start-up on-site 小感
请问pure storage 的那道用spin lock and flags to implement mutex怎么做leader election没人考?
问个OS里面spin lock的问题。请教如何保证函数时thread safe的?
面经+一点个人体会multi thread复习请教
相关话题的讨论汇总
话题: eax话题: lock话题: set话题: test话题: mutex
进入JobHunting版参与讨论
1 (共1页)
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
2
test_and_set 难道不会返回0?
q****x
发帖数: 7404
3
怎么返回0?

【在 p*****2 的大作中提到】
: 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 的大作中提到】
: 里面不是讲了吗?
: 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 的大作中提到】
: 怎么unlock?
:
: lock

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

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

1 (共1页)
进入JobHunting版参与讨论
相关主题
multi thread复习请教菜鸟请教多线程怎么学
Re: 别了,纽约 (转载)请问pure storage 的那道用spin lock and flags to implement mutex怎么做
FLAG rej/offer 求比较问个OS里面spin lock的问题。
pure storage一道面试题面经+一点个人体会
请教大牛用mutex lock实现reader writer lock大家都是怎么学习mutex, lock, signal等等的?
请问C++ threading w/ lock free algorithms求教一个今天被面到的多线程的问题
embedded Linux ,面试了几次,都问这个问题了。不知道答案??人生中第一次面试
怎么才是 精简,准确呢? spinlock VS semaphore 的 区别??Google 电面面经
相关话题的讨论汇总
话题: eax话题: lock话题: set话题: test话题: mutex