由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 贡献一道湾区小公司的面试题 Medallia
相关主题
面试题爆个L家面静吧
pthread 编程还是要看看阿failed bloomberg phone interview
read-write locker的实现MITBBS 面试题第一题
C++ 实现读写锁的问题 (vmware电面考过)新鲜出炉的面试题,关于多线程的
急求大神指导一道面经LI面试题: 实现Blocking Queue
一道涉及OO,算法,多线程的设计题pure storage一道面试题
F家电面问一个G家面试题
LinkedIn 电面面试题:Data structure to find top 10 search strings
相关话题的讨论汇总
话题: lock话题: mutex话题: hashmap话题: slot话题: queue
进入JobHunting版参与讨论
1 (共1页)
a*****8
发帖数: 10
1
一个小时的phone interview
让实现一个支持多线程的hashmap (就是支持分布式系统的)
完全没有想法 挂了
给大家讨论一下
j*****y
发帖数: 1071
2
bless.
感觉就是对于 insert, find, delete 这些操作需要 lock吧?

【在 a*****8 的大作中提到】
: 一个小时的phone interview
: 让实现一个支持多线程的hashmap (就是支持分布式系统的)
: 完全没有想法 挂了
: 给大家讨论一下

M********5
发帖数: 715
3
这道题就是考你在实现push和pop的时候要用个thread_lock吧,应该,好像不需要很多多
线程的概念。。。不知道还有没有人有其他意见。。。
h****n
发帖数: 1093
4
其实就是对query,insert,delete操作加锁即可
注意不要对整个hashtable加锁,这样子并行化性能低下
要对每一次被indexed的slot加锁

【在 a*****8 的大作中提到】
: 一个小时的phone interview
: 让实现一个支持多线程的hashmap (就是支持分布式系统的)
: 完全没有想法 挂了
: 给大家讨论一下

w****x
发帖数: 2483
5
该不是要实现lock free的hash map吧
c*****a
发帖数: 808
6
是不是类似这样,不太懂系统
private Lock lock = new Lock();
public int delete(int x){
lock.lock();
int val = super.delete(x);
lock.unlock();
return val;
}
The lock() method locks the Lock instance so that all threads calling lock()
are blocked until unlock() is executed.
M********5
发帖数: 715
7
这个怎么实现,加thread_lock的时候不就是
void insert(int num){
thread_lock();
map.insert(num);
thread_unlock();
}
没有注意语法的正确与否,只表达了idea。。。加锁的时候不是整个container的数据
都lock起来了吗?

【在 h****n 的大作中提到】
: 其实就是对query,insert,delete操作加锁即可
: 注意不要对整个hashtable加锁,这样子并行化性能低下
: 要对每一次被indexed的slot加锁

j*****y
发帖数: 1071
8
对 slot 加锁怎么做阿? 我下面的code 感觉是对整个 hash table加锁了。
请指点,多谢 :)
class hashmap
{
int m;
pair table[m];
pthread_mutex_t lock;
int hashfunc(string);
public:
void insert(pair v)
{
pthread_mutex_lock(&lock);
int slot = hashfunc(v.first);
table[slot] = v;
pthread_mutex_unlock(&lock);
}

};

【在 h****n 的大作中提到】
: 其实就是对query,insert,delete操作加锁即可
: 注意不要对整个hashtable加锁,这样子并行化性能低下
: 要对每一次被indexed的slot加锁

h****n
发帖数: 1093
9
题目应该是要你自己设计一个hashmap而不使用stl里的hashmap
如果可以自己设计hashmap,简单的做法是申请一个mutex数组,数组的大小和
hashtable slot数目一致,一一对应
如果对并行性能要求不高那就另当别论了

【在 j*****y 的大作中提到】
: 对 slot 加锁怎么做阿? 我下面的code 感觉是对整个 hash table加锁了。
: 请指点,多谢 :)
: class hashmap
: {
: int m;
: pair table[m];
: pthread_mutex_t lock;
: int hashfunc(string);
: public:
: void insert(pair v)

j*****y
发帖数: 1071
10
明白意思了, 需要一对一的 mutex来锁定相应的 slot. 如果只有一个 mutex 的话,
就只能锁定整个 table了吧? 多谢 :)

【在 h****n 的大作中提到】
: 题目应该是要你自己设计一个hashmap而不使用stl里的hashmap
: 如果可以自己设计hashmap,简单的做法是申请一个mutex数组,数组的大小和
: hashtable slot数目一致,一一对应
: 如果对并行性能要求不高那就另当别论了

相关主题
一道涉及OO,算法,多线程的设计题爆个L家面静吧
F家电面failed bloomberg phone interview
LinkedIn 电面MITBBS 面试题第一题
进入JobHunting版参与讨论
M********5
发帖数: 715
11
多谢指点,明白了。。。

【在 h****n 的大作中提到】
: 题目应该是要你自己设计一个hashmap而不使用stl里的hashmap
: 如果可以自己设计hashmap,简单的做法是申请一个mutex数组,数组的大小和
: hashtable slot数目一致,一一对应
: 如果对并行性能要求不高那就另当别论了

j*****y
发帖数: 1071
12
还有一个问题, 对于 queue 里面的操作,  能做到对于 slot 来锁定吗? 感觉
要复杂些, 因为 dequeue 和 enqueue 有依赖关系.

【在 h****n 的大作中提到】
: 题目应该是要你自己设计一个hashmap而不使用stl里的hashmap
: 如果可以自己设计hashmap,简单的做法是申请一个mutex数组,数组的大小和
: hashtable slot数目一致,一一对应
: 如果对并行性能要求不高那就另当别论了

h****n
发帖数: 1093
13
queue和这个问题不太一样,hash里面的slot是independent所以才能这么做,queue要
对整个queue加锁的,所能优化的地方有两点,第一个是尽量降低临界区也就是锁的时
间,第二个就是要采用semaphore同步机制来避免queue为空的时候pop操作busy loop,
queue满的时候push操作busy loop。具体可参考semaphore如何解决经典的生产者消费
者问题

【在 j*****y 的大作中提到】
: 还有一个问题, 对于 queue 里面的操作,  能做到对于 slot 来锁定吗? 感觉
: 要复杂些, 因为 dequeue 和 enqueue 有依赖关系.

y*******g
发帖数: 6599
14
多线程hashmap 和支持分布式系统的DHT区别很大吧?
多线程concurrenthashmap就可以了。 主要idea就是分bucket来lock

【在 a*****8 的大作中提到】
: 一个小时的phone interview
: 让实现一个支持多线程的hashmap (就是支持分布式系统的)
: 完全没有想法 挂了
: 给大家讨论一下

h****n
发帖数: 1093
15
agree,这两个问题是有区别,分布式的话hash table要分配到各个机器上,而不是整
个存在一个机器里面,之间需要协议来保证coherency 不过感觉电面的话分布式应该不
会让你设计,这可不是十几二十分钟能搞定的,顶多说说idea

【在 y*******g 的大作中提到】
: 多线程hashmap 和支持分布式系统的DHT区别很大吧?
: 多线程concurrenthashmap就可以了。 主要idea就是分bucket来lock

c********t
发帖数: 5706
16
难道不是简单的synchronized就行吗?如下:
public class NewHashMap extends HashMap {
public synchronized void put(K a, V b){
super.put(a,b);
}

public synchronized V get(K a){
return super.get(a);
}
}

【在 a*****8 的大作中提到】
: 一个小时的phone interview
: 让实现一个支持多线程的hashmap (就是支持分布式系统的)
: 完全没有想法 挂了
: 给大家讨论一下

c********t
发帖数: 5706
17
哦,我也后知后觉了。多谢!

【在 h****n 的大作中提到】
: 题目应该是要你自己设计一个hashmap而不使用stl里的hashmap
: 如果可以自己设计hashmap,简单的做法是申请一个mutex数组,数组的大小和
: hashtable slot数目一致,一一对应
: 如果对并行性能要求不高那就另当别论了

j*****y
发帖数: 1071
18
谢谢。 刚才看了 那个 consumer/producer 的 wiki, 对于 queue而已就是要对于
queue的size用 semaphore, 是吧?

【在 h****n 的大作中提到】
: queue和这个问题不太一样,hash里面的slot是independent所以才能这么做,queue要
: 对整个queue加锁的,所能优化的地方有两点,第一个是尽量降低临界区也就是锁的时
: 间,第二个就是要采用semaphore同步机制来避免queue为空的时候pop操作busy loop,
: queue满的时候push操作busy loop。具体可参考semaphore如何解决经典的生产者消费
: 者问题

h****n
发帖数: 1093
19
其实两个binary semaphore就足够了,一个sem_full另外一个是sem_empty 初值都为0
pop操作只有在检测到queue为空的时候才去wait(sem_full),当push一个新元素的时候
都会去notify一个等待的线程
push操作检测queue为满的时候做类似操作
如果光用mutex的话,当queue为空的话,做pop操作的线程即使拿到mutex每次都检测到
queue为空,这样子就做了很多无谓的工作,还占用了时间片
而用同步机制的话,这种情况下会被scheduler直接放进pending list里面直到被
notify避免了cpu的浪费

【在 j*****y 的大作中提到】
: 谢谢。 刚才看了 那个 consumer/producer 的 wiki, 对于 queue而已就是要对于
: queue的size用 semaphore, 是吧?

1 (共1页)
进入JobHunting版参与讨论
相关主题
面试题:Data structure to find top 10 search strings急求大神指导一道面经
G家 system design 和 open ended questions一道涉及OO,算法,多线程的设计题
攒人品。面试经历(1)F家电面
攒人品。面试经历(2)LinkedIn 电面
面试题爆个L家面静吧
pthread 编程还是要看看阿failed bloomberg phone interview
read-write locker的实现MITBBS 面试题第一题
C++ 实现读写锁的问题 (vmware电面考过)新鲜出炉的面试题,关于多线程的
相关话题的讨论汇总
话题: lock话题: mutex话题: hashmap话题: slot话题: queue