【问题标题】:Posix thread in cc中的Posix线程
【发布时间】: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-&gt;height/nThreads + 1; 为什么是 nThreads + 1 而不仅仅是 nThreads,我知道问这个问题很幼稚,但我无法弄清楚背后的原因。

【问题讨论】:

  • 这个具体的perThread值被实际的图像处理代码使用,没有书我们是看不到的。大概如果 -1 被删除,就会有一个像素的偏移(注意 perThread 是(src-&gt;height / nThreads) + 1,而不是src -&gt; 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


【解决方案1】:

我发现 nThreads + 1 是主线程,因为有 N+1 个主线程产生线程并等待只有 N 个工作线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多