c - 什么时候销毁 pthread 屏障是安全的?

标签 c multithreading posix pthreads

如果我有一个初始化的 pthread_barrier_t,什么时候销毁它是安全的?下面的例子安全吗?

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);
  }
}

最佳答案

pthread_barrier_wait() 返回后,所有线程都会遇到障碍并继续进行。由于只有一个线程被赋予 PTHREAD_BARRIER_SERIAL_THREAD 返回值,因此可以安全地使用它来有条件地包装销毁代码,如下所示:

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

此外,请注意,如果屏障正在使用(即另一个线程已调用 pthread_barrier_wait())。

关于c - 什么时候销毁 pthread 屏障是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/874432/

相关文章:

c - 使用 POSIX IO 原语逐行读取文件

c++ - 如何包装 posix_memalign(在 mac 上编译旧代码库)?

c - Windows上带有c的128位整数?

c - printf 可能会影响包含其中的函数的返回吗?

java - 托管语言是否锁定刷新并重新加载 native 库的变量?

java - 如果当前线程 hibernate ,ThreadPoolExecutor 是否会生成新线程

c - 如何实现像 memcpy() 这样的快速复制功能?

java - Java中信号量的实现

c# - 非阻塞并行(TPL)的互锁使用问题

c - 结构中的 "s"是什么意思?