Redian新闻
>
贡献T家新鲜面经,求个bless
avatar
贡献T家新鲜面经,求个bless# JobHunting - 待字闺中
P*A
1
写个函数把一个数组通过一个函数map到另一个数组
例子,
f(n) { return ++n; }
m([1,2], f) => [2,3]
要求可以多线程并行处理多个数组元素。
avatar
j*y
2
Bless

【在 P*A 的大作中提到】
: 写个函数把一个数组通过一个函数map到另一个数组
: 例子,
: f(n) { return ++n; }
: m([1,2], f) => [2,3]
: 要求可以多线程并行处理多个数组元素。

avatar
l*u
3
bless

【在 P*A 的大作中提到】
: 写个函数把一个数组通过一个函数map到另一个数组
: 例子,
: f(n) { return ++n; }
: m([1,2], f) => [2,3]
: 要求可以多线程并行处理多个数组元素。

avatar
G*e
4
bless!
avatar
d*a
5
这题你怎么答的啊?
avatar
d*a
6
这题你怎么答的啊?
avatar
f*l
7
bless,电面么?
avatar
s*0
8
Functors.
If you said function pointers, I'd be interested in knowing how to make that
thread safe.
avatar
k*g
9
如果单纯的只是每个元素加一,不同thread处理不同区域的元素,应该不存在thread
safe issue吧?
这题考点是什么?LZ咋答的?
avatar
P*A
10
我开始先写了个最基本的循环的版本,
面试官说现在要求在多核的机器上并行处理数组元素,
然后我写了每个元素一个线程的,
面试官说数组很大的话,会有太多线程
然后我就跟他说了可以把数组根据cpu的书目分段,每段一个线程,
面试官说这样弄,不同线程需要的时间不同,效率就不高了。
然后就没时间了,不过我也没辙了。
我对多线程也不熟,被考到这题也比较郁闷;不过我问他用多线程的时候,他说你觉得
有必要就用,是不是可以不用?
还是等大牛来给个标准的解答。

【在 k***g 的大作中提到】
: 如果单纯的只是每个元素加一,不同thread处理不同区域的元素,应该不存在thread
: safe issue吧?
: 这题考点是什么?LZ咋答的?

avatar
w*x
11
隐式线程池
avatar
p*p
12
big big bless!
avatar
n*s
13
Bless

【在 P*A 的大作中提到】
: 写个函数把一个数组通过一个函数map到另一个数组
: 例子,
: f(n) { return ++n; }
: m([1,2], f) => [2,3]
: 要求可以多线程并行处理多个数组元素。

avatar
d*a
14
搞个全局的index,用个锁保护index就可以了. 可以当成一个只有消费者的生产者-消
费者模型来看。
int index = 0;
void m(int *a, int n, void (*f)(int * ))
{
lock(mutex);
index++;
unlock(mutex);
if (index < n)
f( &a[index]);
}
void f(int *p)
{
*p = *p + 1;
}
avatar
j*e
15
可以把数据分成n段(n >> cpu数),然后搞个n bit的bitmap,
然后每个线程通过mutex从bitmap里找一个0,然后把它改成1,
然后去处理这个bit对应的那段数据。这样即使每个线程处理
速度不同,也没有太大关系。线程数量就跟CPU数量相同。

【在 P*A 的大作中提到】
: 我开始先写了个最基本的循环的版本,
: 面试官说现在要求在多核的机器上并行处理数组元素,
: 然后我写了每个元素一个线程的,
: 面试官说数组很大的话,会有太多线程
: 然后我就跟他说了可以把数组根据cpu的书目分段,每段一个线程,
: 面试官说这样弄,不同线程需要的时间不同,效率就不高了。
: 然后就没时间了,不过我也没辙了。
: 我对多线程也不熟,被考到这题也比较郁闷;不过我问他用多线程的时候,他说你觉得
: 有必要就用,是不是可以不用?
: 还是等大牛来给个标准的解答。

avatar
c*r
16
Bless
avatar
s*n
17
omptl
avatar
R*a
18
bless
avatar
n*2
19
bless
avatar
P*A
20
写个函数把一个数组通过一个函数map到另一个数组
例子,
f(n) { return ++n; }
m([1,2], f) => [2,3]
要求可以多线程并行处理多个数组元素。
avatar
j*y
21
Bless

【在 P*A 的大作中提到】
: 写个函数把一个数组通过一个函数map到另一个数组
: 例子,
: f(n) { return ++n; }
: m([1,2], f) => [2,3]
: 要求可以多线程并行处理多个数组元素。

avatar
l*u
22
bless

【在 P*A 的大作中提到】
: 写个函数把一个数组通过一个函数map到另一个数组
: 例子,
: f(n) { return ++n; }
: m([1,2], f) => [2,3]
: 要求可以多线程并行处理多个数组元素。

avatar
G*e
23
bless!
avatar
d*a
24
这题你怎么答的啊?
avatar
d*a
25
这题你怎么答的啊?
avatar
f*l
26
bless,电面么?
avatar
s*0
27
Functors.
If you said function pointers, I'd be interested in knowing how to make that
thread safe.
avatar
k*g
28
如果单纯的只是每个元素加一,不同thread处理不同区域的元素,应该不存在thread
safe issue吧?
这题考点是什么?LZ咋答的?
avatar
P*A
29
我开始先写了个最基本的循环的版本,
面试官说现在要求在多核的机器上并行处理数组元素,
然后我写了每个元素一个线程的,
面试官说数组很大的话,会有太多线程
然后我就跟他说了可以把数组根据cpu的书目分段,每段一个线程,
面试官说这样弄,不同线程需要的时间不同,效率就不高了。
然后就没时间了,不过我也没辙了。
我对多线程也不熟,被考到这题也比较郁闷;不过我问他用多线程的时候,他说你觉得
有必要就用,是不是可以不用?
还是等大牛来给个标准的解答。

【在 k***g 的大作中提到】
: 如果单纯的只是每个元素加一,不同thread处理不同区域的元素,应该不存在thread
: safe issue吧?
: 这题考点是什么?LZ咋答的?

avatar
w*x
30
隐式线程池
avatar
p*p
31
big big bless!
avatar
n*s
32
Bless

【在 P*A 的大作中提到】
: 写个函数把一个数组通过一个函数map到另一个数组
: 例子,
: f(n) { return ++n; }
: m([1,2], f) => [2,3]
: 要求可以多线程并行处理多个数组元素。

avatar
d*a
33
搞个全局的index,用个锁保护index就可以了. 可以当成一个只有消费者的生产者-消
费者模型来看。
int index = 0;
void m(int *a, int n, void (*f)(int * ))
{
lock(mutex);
index++;
unlock(mutex);
if (index < n)
f( &a[index]);
}
void f(int *p)
{
*p = *p + 1;
}
avatar
j*e
34
可以把数据分成n段(n >> cpu数),然后搞个n bit的bitmap,
然后每个线程通过mutex从bitmap里找一个0,然后把它改成1,
然后去处理这个bit对应的那段数据。这样即使每个线程处理
速度不同,也没有太大关系。线程数量就跟CPU数量相同。

【在 P*A 的大作中提到】
: 我开始先写了个最基本的循环的版本,
: 面试官说现在要求在多核的机器上并行处理数组元素,
: 然后我写了每个元素一个线程的,
: 面试官说数组很大的话,会有太多线程
: 然后我就跟他说了可以把数组根据cpu的书目分段,每段一个线程,
: 面试官说这样弄,不同线程需要的时间不同,效率就不高了。
: 然后就没时间了,不过我也没辙了。
: 我对多线程也不熟,被考到这题也比较郁闷;不过我问他用多线程的时候,他说你觉得
: 有必要就用,是不是可以不用?
: 还是等大牛来给个标准的解答。

avatar
c*r
35
Bless
avatar
s*n
36
omptl
avatar
R*a
37
bless
avatar
n*2
38
bless
avatar
f*m
39
能详细说说吗?
谢谢。

that

【在 s***0 的大作中提到】
: Functors.
: If you said function pointers, I'd be interested in knowing how to make that
: thread safe.

avatar
r*m
40
package test;
public class MapTest implements Runnable{

int[] a;
int index = 0;

MapTest(int[] a) {
this.a = a;
}

int fun(int i) {
return i+1;
}

@Override
public void run() {
int i;
while((i = getIndex()) < a.length) {
System.out.println(Thread.currentThread().getName() + " " + i);
a[i] = fun(a[i]);
}
}

synchronized int getIndex() {
return (index++);
}
static int MAX_NUM_THREADS = 10;
public static void main(String[] args) throws InterruptedException {
int size = 1000000;
int[] a = new int[size];
for (int i=0; ia[i] = i;
}
MapTest m = new MapTest(a);
for (int i = 0; i < MAX_NUM_THREADS; i++) {
Thread t = new Thread(m);
t.start();
}
}
}
avatar
m*s
41
Bless

【在 P*A 的大作中提到】
: 写个函数把一个数组通过一个函数map到另一个数组
: 例子,
: f(n) { return ++n; }
: m([1,2], f) => [2,3]
: 要求可以多线程并行处理多个数组元素。

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