这种障碍的方法是对的吗?

Met*_*est 9 c c++ multithreading c++11

我发现pthread_barrier_wait非常慢,所以在我的代码中的一个地方我用我的版本的barrier(my_barrier)替换了pthread_barrier_wait,它使用了一个原子变量.我发现它比pthread_barrier_wait快得多.使用这种方法有什么缺陷吗?这是对的吗?另外,我不知道为什么它比pthread_barrier_wait更快?任何线索?

编辑

  • 我主要感兴趣的是线程数相等的核心.

    atomic<int> thread_count = 0;
    
    void my_barrier()
    {     
      thread_count++;
    
      while( thread_count % NUM_OF_THREADS )
       sched_yield();
    }
    
    Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 8

您的屏障实施不起作用,至少如果屏障将被多次使用则不行.考虑这种情况:

  1. NUM_OF_THREADS-1 线程在屏障等待,旋转.
  2. 最后一个线程到达并穿过屏障.
  3. 最后一个线程退出屏障,继续处理,完成下一个任务,然后重新进入屏障等待.
  4. 现在只有其他等待线程被调度,并且它们无法退出屏障,因为计数器再次递增.僵局.

此外,处理使用动态分配障碍的一个经常被忽视但令人讨厌的问题是破坏/释放它们.你知道任何一个线程能够在屏障等待返回后执行destroy/free,只要你知道没有人会再次尝试等待它,但这需要确保所有服务员都已完成触及内存任何服务员醒来前的屏障对象- 不是一个容易解决的问题.看看我过去关于实施障碍的问题......

一旦pthread_barrier_wait返回,障碍如何可以销毁?

可以在Linux上实现正确的故障安全流程共享障碍吗?

除非你知道你有一个特殊情况,其中没有任何困难的问题适用,不要尝试实现自己的应用程序.