问题标签 [barrier]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2807 浏览

multithreading - 如何使用 posix 信号量实现屏障?

如何使用 posix 信号量实现屏障?

当调用函数 my_barrier_wait 时,首先 (N-1) 次它将为数组“arr”中的信号量设置(+1) 并进入睡眠状态(调用 sem_wait)。第 N 次它减少 'arr' 中的信号量并且应该(如我所料)唤醒 [0..bar.number-1] 线程为 'cont' 数组中的信号量发布 +1。它不像屏障那样起作用。

0 投票
1 回答
394 浏览

pthreads - 需要关于 pthread 同步的建议/建议(结合使用条件变量和屏障)

我有以下情况:

我把一个任务分成几个阶段,每个阶段有几个线程做实际的工作,后期的线程需要等待当前阶段的所有线程完成。

例如:

线程 1、2、3 正在执行第一步中的工作

线程 4、5、6 正在执行第二步中的工作

线程 7、8、9 正在执行第三步……

每个步骤中的线程都是独立的,但它们需要等待上一步中的线程完成。

这是我想要实现的方法:

  1. 在当前步骤的每个线程中,等待表示当前步骤是否可以启动的条件
  2. 一旦可以开始当前步骤,所有线程都开始工作,并在屏障上等待此步骤中的所有线程完成
  3. 此步骤中的所有线程完成后,在下一步线程正在等待的条件变量上广播

这有意义吗?这里有什么明显的错误吗?

我被多线程程序的高级语言结构宠坏了,使用 pthread API 对我来说很痛苦。在这里,我需要一些关于此用例中最佳实践的建议?非常感谢

0 投票
0 回答
508 浏览

pthreads - 我们是否需要不止一个 pthread 屏障?例如?

障碍似乎在 Pthreads 中经常使用。Pthreads 提供了 pthread_barrier_init() 原语来帮助创建新的屏障。

但是,根据我自己的经验,我还没有看到任何使用多个障碍的*现实世界程序?我用谷歌搜索并看到了这个主题http://www.linuxquestions.org/questions/programming-9/when-do-you-need-more-than-1-pthread-barrier-variable-752164/。但是,该主题没有介绍任何真正需要超过 1 个障碍的示例程序。

所以,我想知道我们是否在一个程序中需要多个障碍?任何现实世界的例子?

感谢您的意见!

0 投票
2 回答
286 浏览

java - x86 上 Java 的最小侵入性编译障碍

如果我有一个 Java 进程通过共享的 ByteBuffer 或类似的方式与其他进程交互,那么 C/C++ 中编译器屏障的侵入性最小的等价物是什么?不需要可移植性——我对 x86 特别感兴趣。

例如,根据伪代码,我有 2 个进程读取和写入内存区域:

由于 x86 上严格的内存排序(加载到单独的位置不重新排序,读取到单独的位置不重新排序)这在 C++ 中不需要任何内存屏障,只需要每次写入之间和每次读取之间的编译屏障(即 asm volatile)。

如何以最便宜的方式在 Java 中实现相同的排序约束。有什么比写到易失性更不侵入性的吗?

0 投票
0 回答
302 浏览

c# - 由于 C# 的 Barrier 类中的 RemoveParticipants 导致的奇怪死锁

在使用 C Sharp's Barrier 时,我遇到了一个非常奇怪的死锁。目的是看看RemoveParticipants()实际是如何工作的。我从 2 个线程(2 个动作)开始,每个线程执行barrier.SignalAndWait();. 之后,一个线程将删除一名参与者。从这一点开始,屏障计数只有 1。正确地,所有剩余的barrier.SignalAndWait();都应该通过而没有任何死锁。但是,下面的程序是死锁的。

我在跟踪时收​​到的输出是:

另一个注意事项是,如果我在 action2 中注释所有 System.Sleep() 并在 action1 中取消注释 System.Sleep()。然后程序终止:

我不知道为什么上述程序死锁?为什么在它应该通过action2的时候停下来(障碍数只有 1)?barrier.SignalAndWait();

感谢您的观看和任何帮助。

解决方案总结:

这个问题是平台相关的。由于在非本机平台上运行它,我遇到了死锁。我尝试使用 2 个在线编译器(1)http://www.compileonline.com/compile_csharp_online.php,(2)https://compilr.com/并陷入僵局。第一个唯一的编译器使用 mono 来执行 windows 可执行文件(它是非本地的)。我不确定第二个在线编译器的平台。

但是,正如 and 所建议的Phillip Scott Givenssvick我在运行 .Net 4.0 的 Visual C# 2010 上本地安装并运行了该示例,并且死锁消失了。

0 投票
1 回答
226 浏览

java - Java:CyclicBarrier 不起作用

软件应该做一些计算:总共 62500 个循环,一个循环持续时间是 0.5 秒。那将是大约 8 小时的工作(for in for in for)。我必须分成 100 个单独的线程,工作时间将减少到 8 分钟。我无法打开 62500 个线程,因为 CPU,我必须找到仅打开 100 个线程而不是再次打开 100 个线程的解决方案。我尝试使用 CountDownLatch 但我无法重置循环,所以我的解决方案是 CyclicBarrier。

测试

循环不工作。一下子开200个。我尝试调试(eclipse)但我不知道为什么,线程从一个跳到另一个,我无法跟踪结果。

控制台应如下所示:

0 投票
3 回答
30375 浏览

arm - ARM 中屏障(DSB、DMB、ISB)的实际用例

我了解 DSB、DMB 和 ISB 是防止指令重新排序的障碍。我也可以为它们中的每一个找到很多非常好的解释,但是很难想象我必须使用它们的情况。

另外,从开源代码中,我不时看到这些障碍,但很难理解为什么要使用它们。举个例子,在Linux kernel 3.7 tcp_rcv_synsent_state_process函数中,有如下一行:

其中 smp_mb() 基本上是 DMB。你能给我一些你在现实生活中的例子吗?这将有助于更多地了解障碍。

0 投票
2 回答
2238 浏览

c - OpenMP:并行内同步

我有一个这样的代码

基本上我想:1)产生给定数量的线程。每个线程将根据线程的 id 处理 p 的卡盘 2) p 的每个元素必须处理 dtnum 次。处理涉及随机事件 3)每50次迭代,一个线程必须执行另一个操作,而其他线程等待

问题:gcc 说警告:屏障区域可能没有紧密嵌套在工作共享、关键、有序、主或显式任务区域内

我能做些什么?

0 投票
1 回答
52 浏览

memory - 这是使用互斥锁进行线程同步的正确方法吗

这是在没有互斥锁的情况下同步线程的正确方法吗?此代码应该运行很长时间

0 投票
2 回答
99 浏览

c++ - About OMP barrier and dynamic array

Does OMP ensure that the contents of an dynamic array is up-to-date and is visible to all threads after an OMP barrier?