由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 求教一个今天被面到的多线程的问题
相关主题
google面试的多线程问题Google及其它面经 (长,慎入)
L 电面贡献T家新鲜面经,求个bless
请教大侠们hash table 多线程问题一道涉及OO,算法,多线程的设计题
多线程打印Message问题请教一个java Synchronized Blocks和Lock的问题
请教如何保证函数时thread safe的?pure storage 面试题
怎么才是 精简,准确呢? spinlock VS semaphore 的 区别??问一个static variable上锁的问题
谁给讲讲test-and-set怎么实现mutex?请问如何准备多线程问题
问道多线程的简单题目一个multithread的小问题
相关话题的讨论汇总
话题: lock话题: thread话题: critical话题: global话题: section
进入JobHunting版参与讨论
1 (共1页)
m******9
发帖数: 968
1
问题是这样的,多线程中典型的模型就是:
对于某个thread p1
Wait(lock)
// enter critical section
Signal(lock)
比如 lock就是一个mutex,当p1获得了这个lock以后,它进入critical section,工作
完了,就释放lock
他的问题就是:
如果用一个普通的global variable:
global boolean lock = false;
进行如下的操作
thread p1
step 1: 获得lock
step 2: lock = true;
step 3: // enter critical section
step 4: 释放lock ( lock reset to false)
假设step 1和step2 是不能被中断的(atomic),任何thread在进入critical section
之前,都要检查global boolean lock。那这种利用global variable的方法能不能达到
线程安全的目的?
c*m
发帖数: 1114
2
这种情况很容易产生多线程里面的race condition.

【在 m******9 的大作中提到】
: 问题是这样的,多线程中典型的模型就是:
: 对于某个thread p1
: Wait(lock)
: // enter critical section
: Signal(lock)
: 比如 lock就是一个mutex,当p1获得了这个lock以后,它进入critical section,工作
: 完了,就释放lock
: 他的问题就是:
: 如果用一个普通的global variable:
: global boolean lock = false;

s*****i
发帖数: 355
3
double lock checking?

【在 m******9 的大作中提到】
: 问题是这样的,多线程中典型的模型就是:
: 对于某个thread p1
: Wait(lock)
: // enter critical section
: Signal(lock)
: 比如 lock就是一个mutex,当p1获得了这个lock以后,它进入critical section,工作
: 完了,就释放lock
: 他的问题就是:
: 如果用一个普通的global variable:
: global boolean lock = false;

m******9
发帖数: 968
4
我对他讲了race condition的问题,他说 我并有回答他的问题。
c*m
发帖数: 1114
5
hehe,还有就是这个global variable的不安全性问题,其他就应该没了。
这哥么是不是随便网上拉来一道题面试你,其实自己也不怎么懂multi-threading哇?

【在 m******9 的大作中提到】
: 我对他讲了race condition的问题,他说 我并有回答他的问题。
m******9
发帖数: 968
6
能不能具体解释一下“不安全”主要体现在什么方面呢?
还有我仔细想了想,race condition也真的没有回答他的问题,race condition是出现
在多线程争抢lock的时候,一旦某个线程获得了lock,它就不能被打断,按照他的假设
似乎也是安全。

【在 c*m 的大作中提到】
: hehe,还有就是这个global variable的不安全性问题,其他就应该没了。
: 这哥么是不是随便网上拉来一道题面试你,其实自己也不怎么懂multi-threading哇?

o****d
发帖数: 2835
7
单核多线程 还是 多核的?
如果是单核的 并且step1和step2是atomic的 那么应该是安全的
而如果是多核的 两个线程在不同的核上执行
一个线程修改lock=true 不一定会马上被另一个线程看到
另一个线程读到的lock可能还是false的值
这是所谓的 memory consistency 问题
那个程序中没有说如果lock是false就不能进入critical section
这里我假定step1获得锁的过程中需要check这个东西
不然谁都可以进入 lock完全不起作用 题目就失去了意义

【在 m******9 的大作中提到】
: 问题是这样的,多线程中典型的模型就是:
: 对于某个thread p1
: Wait(lock)
: // enter critical section
: Signal(lock)
: 比如 lock就是一个mutex,当p1获得了这个lock以后,它进入critical section,工作
: 完了,就释放lock
: 他的问题就是:
: 如果用一个普通的global variable:
: global boolean lock = false;

x***y
发帖数: 633
8
It can lead to deadlock..Suppose another thread in some other code changes
the variable to false immediately after step2, and then wait for locking the
mutex before setting the variable back to true. Then, thread p1 can not
enter critical section and won't releas the mutex and another thread is
blocked on the mutex forever....
Besides, why don't use the classic method as it still works?

【在 m******9 的大作中提到】
: 问题是这样的,多线程中典型的模型就是:
: 对于某个thread p1
: Wait(lock)
: // enter critical section
: Signal(lock)
: 比如 lock就是一个mutex,当p1获得了这个lock以后,它进入critical section,工作
: 完了,就释放lock
: 他的问题就是:
: 如果用一个普通的global variable:
: global boolean lock = false;

a****l
发帖数: 8211
9
想都不用想,根本就是common sense的问题:如果程序能那么简单的用一个变量来实现
mutex的话,那系统中干什么还要提供那么多各种软件的mutex的系统服务和硬件的mutex
的实现???

【在 m******9 的大作中提到】
: 问题是这样的,多线程中典型的模型就是:
: 对于某个thread p1
: Wait(lock)
: // enter critical section
: Signal(lock)
: 比如 lock就是一个mutex,当p1获得了这个lock以后,它进入critical section,工作
: 完了,就释放lock
: 他的问题就是:
: 如果用一个普通的global variable:
: global boolean lock = false;

h**k
发帖数: 3368
10
面试官假设头两步是原子的。要实现这个假设可是需要很多系统服务和硬件的支持。
我觉得主要问题是这个全局变量是公开的,可以直接修改;所以存在误操作的可能。

mutex

【在 a****l 的大作中提到】
: 想都不用想,根本就是common sense的问题:如果程序能那么简单的用一个变量来实现
: mutex的话,那系统中干什么还要提供那么多各种软件的mutex的系统服务和硬件的mutex
: 的实现???

相关主题
怎么才是 精简,准确呢? spinlock VS semaphore 的 区别??Google及其它面经 (长,慎入)
谁给讲讲test-and-set怎么实现mutex?贡献T家新鲜面经,求个bless
问道多线程的简单题目一道涉及OO,算法,多线程的设计题
进入JobHunting版参与讨论
T*********k
发帖数: 1621
11
不懂,
1. 如果你这个 global lock variable 本身就不是 sychronized 的话, 那么任一
thread 都可能改变它的 value, 那这个 variable 就不是形同虚设了?
2. 如果这个 global lock variable 是 sychronized, 表示同一时间只能有一个一个
thread 能取得控制权,并改变它的 value. 那问题就更大了. global value 是所有
instance 都 share, 假设一个 thread 取得了 lock 的控制权, 把 lock 设置为 true
, 然后进入 critical section, 在里面调用了 wait function, 进入 wait 的状态.
因为所有其他 thread 都被 lock 在外面, 整个 process 就回瘫.
就好比一个冰库就一个门, 一道锁, 一个人进去后把门反锁, 自己睡大觉去, 别人没法
进去把他叫醒, 整个系统就 deadlock.
y*****a
发帖数: 171
12

LZ said step1 and step2 is an atomic operation. you cannot interrupt during
the operation of "read value, check the value and update the value if it is
ok".
true
what you said is a programming issue, because it is the programer's job to
avoid racing condition anyway. that means thead having obtained the lock
will release the lock eventually if no racing condition occurs.

【在 T*********k 的大作中提到】
: 不懂,
: 1. 如果你这个 global lock variable 本身就不是 sychronized 的话, 那么任一
: thread 都可能改变它的 value, 那这个 variable 就不是形同虚设了?
: 2. 如果这个 global lock variable 是 sychronized, 表示同一时间只能有一个一个
: thread 能取得控制权,并改变它的 value. 那问题就更大了. global value 是所有
: instance 都 share, 假设一个 thread 取得了 lock 的控制权, 把 lock 设置为 true
: , 然后进入 critical section, 在里面调用了 wait function, 进入 wait 的状态.
: 因为所有其他 thread 都被 lock 在外面, 整个 process 就回瘫.
: 就好比一个冰库就一个门, 一道锁, 一个人进去后把门反锁, 自己睡大觉去, 别人没法
: 进去把他叫醒, 整个系统就 deadlock.

m******9
发帖数: 968
13
第2点似乎不能解释他的问题,进入冰库里的人,最后是要负责把锁从里面打开的。
综合大家的提示,我想 错误可能是这样的:
step1 和step2 的确是atomic的(这是他的假设)。 可是当p1进入step3的时候,
global lock上的操作已经不再是atomic了,此时lock这个global variable是可以被任
意的修改了,那么任何其他的线程在 p1没有释放lock的情况下 都有机会进入
critical section了。
用冰库的例子就是,p1在众人之中抢到了锁,进入冰库,并且锁住了这个lock(在次过
程中,别人都不能对锁动手脚)。 可是这个锁却是个坏锁,p1已经在冰库内把它反锁
上了,即便p1没有打开锁,可外边的人依然可以将锁打开 进入冰库。

during
is


【在 y*****a 的大作中提到】
:
: LZ said step1 and step2 is an atomic operation. you cannot interrupt during
: the operation of "read value, check the value and update the value if it is
: ok".
: true
: what you said is a programming issue, because it is the programer's job to
: avoid racing condition anyway. that means thead having obtained the lock
: will release the lock eventually if no racing condition occurs.

o****d
发帖数: 2835
14
step1 获得锁的过程应该是要查看一下这个锁是不是被别人持有(lock是不是true),
如果发现lock是true的,那么该线程不可以获得锁,不可以随便改lock的值。
所以要么你是对的 那这个题目就很无聊。。。
可以看看dekker算法。

【在 m******9 的大作中提到】
: 第2点似乎不能解释他的问题,进入冰库里的人,最后是要负责把锁从里面打开的。
: 综合大家的提示,我想 错误可能是这样的:
: step1 和step2 的确是atomic的(这是他的假设)。 可是当p1进入step3的时候,
: global lock上的操作已经不再是atomic了,此时lock这个global variable是可以被任
: 意的修改了,那么任何其他的线程在 p1没有释放lock的情况下 都有机会进入
: critical section了。
: 用冰库的例子就是,p1在众人之中抢到了锁,进入冰库,并且锁住了这个lock(在次过
: 程中,别人都不能对锁动手脚)。 可是这个锁却是个坏锁,p1已经在冰库内把它反锁
: 上了,即便p1没有打开锁,可外边的人依然可以将锁打开 进入冰库。
:

f*******a
发帖数: 612
15
right answer. it is a very popular and basic problem in embedded system.

during
it is
to

【在 y*****a 的大作中提到】
:
: LZ said step1 and step2 is an atomic operation. you cannot interrupt during
: the operation of "read value, check the value and update the value if it is
: ok".
: true
: what you said is a programming issue, because it is the programer's job to
: avoid racing condition anyway. that means thead having obtained the lock
: will release the lock eventually if no racing condition occurs.

z***e
发帖数: 5393
16
no, not so simple, but not difficult either.
这个问题本身很含糊,最含糊的在第一步:获得----关键在这一步的定义上。
windows下,WaitForSingleObject()可以说是“获得”,InterlockedExchangeAdd(...)
也可以说是一个atomic的“获得”,但是接下来的设计就截然不同。
lz应该利用这个问题跟对方多讨论,顺便展示你在multi-threading方面的不凡见解让
对方惊为天人...:D

mutex

【在 a****l 的大作中提到】
: 想都不用想,根本就是common sense的问题:如果程序能那么简单的用一个变量来实现
: mutex的话,那系统中干什么还要提供那么多各种软件的mutex的系统服务和硬件的mutex
: 的实现???

s******s
发帖数: 3694
17
Zlike, 你是不是老在戏版混? 俺记得以前在那回过你的贴 ~

【在 z***e 的大作中提到】
: no, not so simple, but not difficult either.
: 这个问题本身很含糊,最含糊的在第一步:获得----关键在这一步的定义上。
: windows下,WaitForSingleObject()可以说是“获得”,InterlockedExchangeAdd(...)
: 也可以说是一个atomic的“获得”,但是接下来的设计就截然不同。
: lz应该利用这个问题跟对方多讨论,顺便展示你在multi-threading方面的不凡见解让
: 对方惊为天人...:D
:
: mutex

m******9
发帖数: 968
18
具体说说

【在 f*******a 的大作中提到】
: right answer. it is a very popular and basic problem in embedded system.
:
: during
: it is
: to

z***e
发帖数: 5393
19
我一般在sex板潜水...

【在 s******s 的大作中提到】
: Zlike, 你是不是老在戏版混? 俺记得以前在那回过你的贴 ~
a****l
发帖数: 8211
20
其实我看也没有多少的"截然不同",也就是进入critical section的不同的准备工作罢
了,当然这也是个含糊的表达,关键是对"截然不同"的定义是怎么样的...

【在 z***e 的大作中提到】
: no, not so simple, but not difficult either.
: 这个问题本身很含糊,最含糊的在第一步:获得----关键在这一步的定义上。
: windows下,WaitForSingleObject()可以说是“获得”,InterlockedExchangeAdd(...)
: 也可以说是一个atomic的“获得”,但是接下来的设计就截然不同。
: lz应该利用这个问题跟对方多讨论,顺便展示你在multi-threading方面的不凡见解让
: 对方惊为天人...:D
:
: mutex

1 (共1页)
进入JobHunting版参与讨论
相关主题
一个multithread的小问题请教如何保证函数时thread safe的?
请教一个多线程设计的面试题怎么才是 精简,准确呢? spinlock VS semaphore 的 区别??
求问:有什么多线程的复习资料不?谁给讲讲test-and-set怎么实现mutex?
大家都是怎么学习mutex, lock, signal等等的?问道多线程的简单题目
google面试的多线程问题Google及其它面经 (长,慎入)
L 电面贡献T家新鲜面经,求个bless
请教大侠们hash table 多线程问题一道涉及OO,算法,多线程的设计题
多线程打印Message问题请教一个java Synchronized Blocks和Lock的问题
相关话题的讨论汇总
话题: lock话题: thread话题: critical话题: global话题: section