如果是安全的破坏pthread的障碍? [英] When is it safe to destroy a pthread barrier?

查看:100
本文介绍了如果是安全的破坏pthread的障碍?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有一个初始化pthread_barrier_t,当是安全的破坏呢?就是下面的例子安全吗?

  pthread_barrier_t屏障;
...
INT RC = pthread_barrier_wait(B);
如果(RC = PTHREAD_BARRIER_SERIAL_THREAD和放大器;!&安培;!RC = 0){
  PERROR(pthread_barrier_wait);
  出口(1);
}如果(ID == 0){
  如果(pthread_barrier_destroy(及(线程[t_root] .info.tmp_barrier))){
    PERROR(pthread_barrier_destroy);
    出口(1);
  }
}


解决方案

pthread_barrier_wait()的回报,所有的线程将相继命中屏障和跟进。由于只有一个线程被赋予 PTHREAD_BARRIER_SERIAL_THREAD 的返回值,就可以安全地用它来包裹有条件的破坏code,像这样:

  INT RC = pthread_barrier_wait(和b)
如果(RC == PTHREAD_BARRIER_SERIAL_THREAD)
{
    pthread_barrier_destroy(和b);
}

此外,要知道, pthread_barrier_destroy()将返回 EBUSY 的结果,如果障碍是使用(即另一个线程曾呼吁 pthread_barrier_wait())。

If I have an initialised pthread_barrier_t, when is it safe to destroy it? Is the following example safe?

pthread_barrier_t barrier;
...
int rc = pthread_barrier_wait(b);
if (rc != PTHREAD_BARRIER_SERIAL_THREAD && rc != 0){
  perror("pthread_barrier_wait");
  exit(1);
}

if (id == 0){
  if(pthread_barrier_destroy(&(threads[t_root].info.tmp_barrier))){
    perror("pthread_barrier_destroy");
    exit(1);
  }
}

解决方案

After pthread_barrier_wait() returns, all threads will have hit the barrier and are proceeding. Since only one thread is given the PTHREAD_BARRIER_SERIAL_THREAD return value, it's safe to use that to conditionally wrap the destruction code like so:

int rc = pthread_barrier_wait(&b)
if ( rc == PTHREAD_BARRIER_SERIAL_THREAD )
{
    pthread_barrier_destroy(&b);
}

Also, be aware that pthread_barrier_destroy() will return a result of EBUSY if the barrier was in use (i.e. another thread had called pthread_barrier_wait()).

这篇关于如果是安全的破坏pthread的障碍?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆