2011-11-24 47 views
2

伪代码障碍:如何处理与线程退出

void * thread_start(void *arg) { 
    while (1) { 
     /* for each column. Only run columns the thread_num 
      is assigned to */ 
     column_count = thread_num; 
     for (; column_count < dim - 1; column_count+=threads) { 
      /* do thread work for data chunk */ 
     } 

     /* barrier */ 
     barrier_result = pthread_barrier_wait(barrier); 

     if (not_finished == 0) { 
      /* finished */ 
      break; 
      /* break while loop, end thread. 
       The barrier is now broken because it is no longer 
       getting called by this thread */ 
     } 

     /* we are not finished, loop around and 
      do thread work on next data chunk */ 
    } 
} 

我与障碍的问题是你如何处理与其它线程之前结束线程?

屏障意味着每个线程必须等待每个其他线程。

有什么技术可以确保所有线程同时结束?

我试图延续着的循环,但忽视了“线程的工作”,但在这种情况下,所有8个线程完成,有没有合理的方式来告诉线程“你都做,你现在可以全部退出”

编辑:

算法:

  1. 上的数据块
  2. 段运行操作,如果数据块的线程的段完成termina TE。
  3. 障碍等待。
  4. 一个线程替换一块数据有一些新的数据
  5. 重复1

编辑2:

有覆盖一个屏障,一个阻隔任何优雅的方式尺寸较小? (无需在屏障上放置互斥锁)

+1

甚至没有不雅的方式:),你不能复制另一个障碍或在相同的障碍上多次调用'pthread_barrier_init'。 – chill

回答

0

确保线程在程序逻辑的本质中同时结束。如果算法调用线程在不同的时间退出,那么对于该具体算法来说,障碍并不是合适的并发控制机制。

编辑:

你可以原子方式增加了“finished_count”和循环,没有做任何工作,然后其他参与的障碍,而这一数字小于屏障计数(保护读取/写入finished_count与适当的互斥体)。

编辑: 我不知道如果我理解你的附加说明好了,我只是写此基础上你的原代码,也许它会为你工作:

int finished_count; 

void * thread_start(void *arg) { 
    int finished = 0; 

    while (1) { 

     if (finished) { 
      pthread_mutex_lock (&finished_lock); 
      if (finished_count == 8) { 
       pthread_mutex_unlock (&finished_lock); 
       break; 
      } 
      pthread_mutex_unlock (&finished_lock); 
     } else { 
      /* for each column. Only run columns the thread_num 
       is assigned to */ 
      column_count = thread_num; 
      for (; column_count < dim - 1; column_count+=threads) { 
       /* do thread work for data chunk */ 
      } 

      /* set "finished" as appropriate */ 

      /* Check if we have just finished. */ 
      if (finished) { 
       pthread_mutex_lock (&finished_lock); 
       ++finished_count; 
       pthread_mutex_unlock (&finished_lock); 
      } 
     } 

     barrier_result = pthread_barrier_wait(barrier); 
    } 

    return 0; 
} 

编辑:

为了澄清上述有关复制过或重新初始化我的意见,说POSIX:

http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_barrier_init.html

如果调用pthread_barrier_init()指定已经初始化的障碍,则结果未定义。

仅可被用于执行同步由屏障引用的对象。在对pthread_barrier_destroy()或pthread_barrier_wait()的调用中引用该对象的副本的结果未定义。

+0

我用我的“算法”的描述更新了问题。你有什么建议吗? – Raynos

+0

你明白了这个问题。我将不得不保持完成计数。替代方案是用新的较小屏障覆盖屏障。我不知道哪个更高性能。 – Raynos

+0

变成了,而不是保留一个“线程完成”的计数器,并等待到n。应该为“线程未完成”保留标志,并且如果n个线程中没有一个线程“未完成” – Raynos