【发布时间】:2020-08-05 16:55:08
【问题描述】:
我正在阅读 Andrew 和 Bracy 的一本名为“所有编程”的书。目前,我在并发,遇到了这个功能:
void smoothParallel(image_t * src, image_t * dst, int nThreads){
int perThread = src->height/ nThreads + 1;
int extras = src->height/nThreads;
...
pthread_t * threads = malloc(nThreads * sizeof(*threads));
for(int i = 0; i < nThreads; i++){
...
perThread--;
}
thr_arg * arg = malloc(sizeof(*arg));
arg->src = src;
arg->dst = dst;
arg->startY = curr;
arg->endY = curr + perThread;
curr += perThread;
pthread_create(&threads[i], NULL, smoothThread, arg);
for (int i = 0; i < nThreads ; i++) {
pthread_join(threads[i], NULL);
}
}
所以,我无法理解的是 int perThread = src->height/nThreads + 1; 为什么是 nThreads + 1 而不仅仅是 nThreads,我知道问这个问题很幼稚,但我无法弄清楚背后的原因。
【问题讨论】:
-
这个具体的
perThread值被实际的图像处理代码使用,没有书我们是看不到的。大概如果 -1 被删除,就会有一个像素的偏移(注意 perThread 是(src->height / nThreads) + 1,而不是src -> height / (nThreads + 1))你可以包含线程中运行的实际代码的 sn-p 吗?跨度> -
我更新了代码。还有一个 typedef struct_thr_arg 与 * src, * image_t 类型的 dst 和 int 类型的 startY,endY。 the_arg 作为结构名称,
-
谢谢。我仍然不确定
smoothThread在内部到底做了什么,所以我无法提供更多的见解。我最好的猜测是,这可以确保每个线程上完成的工作量被四舍五入 up 以避免跳过图像中的行。 -
smoothThread,基本上是通过迭代从 startY 到 endY 的像素和另一个计算加权像素的函数来平滑图像,这在书中没有给出。
-
是的,我认为避免由于舍入而跳过行是我能得出的最佳结论。
标签: c concurrency posix