P*A 发帖数: 189 | 1 写个函数把一个数组通过一个函数map到另一个数组
例子,
f(n) { return ++n; }
m([1,2], f) => [2,3]
要求可以多线程并行处理多个数组元素。 |
j****y 发帖数: 550 | 2 Bless
【在 P*A 的大作中提到】 : 写个函数把一个数组通过一个函数map到另一个数组 : 例子, : f(n) { return ++n; } : m([1,2], f) => [2,3] : 要求可以多线程并行处理多个数组元素。
|
l*********u 发帖数: 19053 | 3 bless
【在 P*A 的大作中提到】 : 写个函数把一个数组通过一个函数map到另一个数组 : 例子, : f(n) { return ++n; } : m([1,2], f) => [2,3] : 要求可以多线程并行处理多个数组元素。
|
G******e 发帖数: 229 | |
d******a 发帖数: 238 | |
d******a 发帖数: 238 | |
f**l 发帖数: 359 | |
s***0 发帖数: 117 | 8 Functors.
If you said function pointers, I'd be interested in knowing how to make that
thread safe. |
k***g 发帖数: 58 | 9 如果单纯的只是每个元素加一,不同thread处理不同区域的元素,应该不存在thread
safe issue吧?
这题考点是什么?LZ咋答的? |
P*A 发帖数: 189 | 10 我开始先写了个最基本的循环的版本,
面试官说现在要求在多核的机器上并行处理数组元素,
然后我写了每个元素一个线程的,
面试官说数组很大的话,会有太多线程
然后我就跟他说了可以把数组根据cpu的书目分段,每段一个线程,
面试官说这样弄,不同线程需要的时间不同,效率就不高了。
然后就没时间了,不过我也没辙了。
我对多线程也不熟,被考到这题也比较郁闷;不过我问他用多线程的时候,他说你觉得
有必要就用,是不是可以不用?
还是等大牛来给个标准的解答。
【在 k***g 的大作中提到】 : 如果单纯的只是每个元素加一,不同thread处理不同区域的元素,应该不存在thread : safe issue吧? : 这题考点是什么?LZ咋答的?
|
|
|
w****x 发帖数: 2483 | |
p**p 发帖数: 2493 | |
n**s 发帖数: 426 | 13 Bless
【在 P*A 的大作中提到】 : 写个函数把一个数组通过一个函数map到另一个数组 : 例子, : f(n) { return ++n; } : m([1,2], f) => [2,3] : 要求可以多线程并行处理多个数组元素。
|
d******a 发帖数: 238 | 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;
} |
j********e 发帖数: 1192 | 15 可以把数据分成n段(n >> cpu数),然后搞个n bit的bitmap,
然后每个线程通过mutex从bitmap里找一个0,然后把它改成1,
然后去处理这个bit对应的那段数据。这样即使每个线程处理
速度不同,也没有太大关系。线程数量就跟CPU数量相同。
【在 P*A 的大作中提到】 : 我开始先写了个最基本的循环的版本, : 面试官说现在要求在多核的机器上并行处理数组元素, : 然后我写了每个元素一个线程的, : 面试官说数组很大的话,会有太多线程 : 然后我就跟他说了可以把数组根据cpu的书目分段,每段一个线程, : 面试官说这样弄,不同线程需要的时间不同,效率就不高了。 : 然后就没时间了,不过我也没辙了。 : 我对多线程也不熟,被考到这题也比较郁闷;不过我问他用多线程的时候,他说你觉得 : 有必要就用,是不是可以不用? : 还是等大牛来给个标准的解答。
|
c*******r 发帖数: 610 | |
s******n 发帖数: 3946 | |
R*****a 发帖数: 48 | |
n*2 发帖数: 19062 | |
P*A 发帖数: 189 | 20 写个函数把一个数组通过一个函数map到另一个数组
例子,
f(n) { return ++n; }
m([1,2], f) => [2,3]
要求可以多线程并行处理多个数组元素。 |
|
|
j****y 发帖数: 550 | 21 Bless
【在 P*A 的大作中提到】 : 写个函数把一个数组通过一个函数map到另一个数组 : 例子, : f(n) { return ++n; } : m([1,2], f) => [2,3] : 要求可以多线程并行处理多个数组元素。
|
l*********u 发帖数: 19053 | 22 bless
【在 P*A 的大作中提到】 : 写个函数把一个数组通过一个函数map到另一个数组 : 例子, : f(n) { return ++n; } : m([1,2], f) => [2,3] : 要求可以多线程并行处理多个数组元素。
|
G******e 发帖数: 229 | |
d******a 发帖数: 238 | |
d******a 发帖数: 238 | |
f**l 发帖数: 359 | |
s***0 发帖数: 117 | 27 Functors.
If you said function pointers, I'd be interested in knowing how to make that
thread safe. |
k***g 发帖数: 58 | 28 如果单纯的只是每个元素加一,不同thread处理不同区域的元素,应该不存在thread
safe issue吧?
这题考点是什么?LZ咋答的? |
P*A 发帖数: 189 | 29 我开始先写了个最基本的循环的版本,
面试官说现在要求在多核的机器上并行处理数组元素,
然后我写了每个元素一个线程的,
面试官说数组很大的话,会有太多线程
然后我就跟他说了可以把数组根据cpu的书目分段,每段一个线程,
面试官说这样弄,不同线程需要的时间不同,效率就不高了。
然后就没时间了,不过我也没辙了。
我对多线程也不熟,被考到这题也比较郁闷;不过我问他用多线程的时候,他说你觉得
有必要就用,是不是可以不用?
还是等大牛来给个标准的解答。
【在 k***g 的大作中提到】 : 如果单纯的只是每个元素加一,不同thread处理不同区域的元素,应该不存在thread : safe issue吧? : 这题考点是什么?LZ咋答的?
|
w****x 发帖数: 2483 | |
|
|
p**p 发帖数: 2493 | |
n**s 发帖数: 426 | 32 Bless
【在 P*A 的大作中提到】 : 写个函数把一个数组通过一个函数map到另一个数组 : 例子, : f(n) { return ++n; } : m([1,2], f) => [2,3] : 要求可以多线程并行处理多个数组元素。
|
d******a 发帖数: 238 | 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;
} |
j********e 发帖数: 1192 | 34 可以把数据分成n段(n >> cpu数),然后搞个n bit的bitmap,
然后每个线程通过mutex从bitmap里找一个0,然后把它改成1,
然后去处理这个bit对应的那段数据。这样即使每个线程处理
速度不同,也没有太大关系。线程数量就跟CPU数量相同。
【在 P*A 的大作中提到】 : 我开始先写了个最基本的循环的版本, : 面试官说现在要求在多核的机器上并行处理数组元素, : 然后我写了每个元素一个线程的, : 面试官说数组很大的话,会有太多线程 : 然后我就跟他说了可以把数组根据cpu的书目分段,每段一个线程, : 面试官说这样弄,不同线程需要的时间不同,效率就不高了。 : 然后就没时间了,不过我也没辙了。 : 我对多线程也不熟,被考到这题也比较郁闷;不过我问他用多线程的时候,他说你觉得 : 有必要就用,是不是可以不用? : 还是等大牛来给个标准的解答。
|
c*******r 发帖数: 610 | |
s******n 发帖数: 3946 | |
R*****a 发帖数: 48 | |
n*2 发帖数: 19062 | |
f*********m 发帖数: 726 | 39 能详细说说吗?
谢谢。
that
【在 s***0 的大作中提到】 : Functors. : If you said function pointers, I'd be interested in knowing how to make that : thread safe.
|
r****m 发帖数: 70 | 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; i
a[i] = i;
}
MapTest m = new MapTest(a);
for (int i = 0; i < MAX_NUM_THREADS; i++) {
Thread t = new Thread(m);
t.start();
}
}
} |
|
|
m******s 发帖数: 1469 | 41 Bless
【在 P*A 的大作中提到】 : 写个函数把一个数组通过一个函数map到另一个数组 : 例子, : f(n) { return ++n; } : m([1,2], f) => [2,3] : 要求可以多线程并行处理多个数组元素。
|
p**p 发帖数: 2493 | |