问题标签 [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 投票
3 回答
9383 浏览

opencl - 在 OpenCL 中,mem_fence() 与 barrier() 相比做什么?

不像barrier()(我想我理解),mem_fence()不会影响工作组中的所有项目。OpenCL 规范说(第 6.11.10 节),用于mem_fence()

订购执行内核的工作项的加载和存储。

(因此它适用于单个工作项)。

但是,与此同时,在第 3.3.1 节中,它说:

在工作项内存中具有加载/存储一致性。

所以一个工作项中,内存是一致的。

那么什么样的东西mem_fence()有用呢?它不适用于项目,但在项目中不需要......

请注意,我没有使用原子操作(第 9.5 节等)。mem_fence()是与这些结合使用的想法吗?如果是这样,我很乐意看到一个例子。

谢谢。

规范,供参考。

更新:我可以看到它在 barrier()(隐含地,因为屏障调用mem_fence())一起使用时是如何有用的——但肯定有更多,因为它是单独存在的?

0 投票
3 回答
1629 浏览

c - 使用 MPI 的竞争条件

我正在尝试使用 MPI 实现锦标赛障碍。这是我写的代码。我只写到达阶段和唤醒阶段

我不明白为什么会出现竞争条件。我相信 MPI_Send 和 MPI_Recv 是阻塞函数。但是,有时它不会那样做

编辑:这是发生竞争条件的示例输出。如您所见,甚至在 1 发送消息之前,0 就从 1 收到了消息(“1 到达屏障”)。

0 是第一轮的获胜者

0 收到:1 到达巴里

0 是第 2 轮的获胜者

1是第一轮的失败者

1 发送到达消息

2是第一轮的获胜者

2 收到:3 到达巴里

2是第2轮的失败者

2 发送到达消息

3是第一轮的失败者

3 发送到达信息

0 收到:2 到达巴里

0 发送唤醒信息

0 发送唤醒信息

1 收到:从 0 唤醒消息,第 1 轮有标签

2 收到:从 0 唤醒消息,在第 2 轮带有标签

2 发送唤醒消息

3 收到:从 2 唤醒消息,在第 1 轮带有标签

0 投票
2 回答
3427 浏览

multithreading - 使用二进制信号量实现屏障(一种同步结构)

屏障是一种同步结构,其中一组进程全局同步,即集合中的每个进程到达屏障并等待所有其他进程到达,然后所有进程离开屏障。令集合中的进程数为 3,S 为具有常用 P 和 V 函数的二进制信号量。考虑以下 C 实现的屏障,其中行号显示在左侧。

变量 process_arrived 和 process_left 在所有进程之间共享并初始化为零。在并发程序中,所有三个进程在需要全局同步时都会调用屏障函数。

上述实施会奏效吗?我认为如果立即连续使用两个屏障调用可能会导致死锁,因为进入屏障的第一个进程不会等到 process_arrived 变为零才继续执行 P(S)。

0 投票
1 回答
992 浏览

c - 如何处理线程退出的障碍

伪代码:

我对障碍的问题是如何处理在其他线程之前结束的线程?

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

有哪些技术可以确保所有线程同时结束?

我尝试继续循环但忽略“线程工作”,但在这种情况下,所有 8 个线程都完成了,并且没有明智的方法告诉线程“你都完成了,你现在都可以退出”

编辑:

算法:

  1. 对一段数据运行操作
  2. 如果线程的数据段完成终止。
  3. 障碍等待。
  4. 一个线程用一些新数据替换这条数据
  5. 重复 1。

编辑2:

有没有什么优雅的方法可以用小一号的屏障覆盖屏障?(没有在屏障周围放置互斥锁)

0 投票
2 回答
8020 浏览

c - 为 pthread_cond_broadcast 调用同步线程

我有一个带有“管理器”线程的简单应用程序,它产生十个简单的“工作者”线程。我希望所有“工作”线程都阻塞同一个条件变量(即:condvar),并且我想通过 pthread_cond_broadcast 调用手动通知所有十个线程同时唤醒。

在我的应用程序中,线程可能会遇到错误情况并提前终止,因此可能并非所有十个线程都到达同步点。

一种简单的机制是创建一个 pthread_barrier_t 并让所有 10 个线程调用 pthread_barrier_wait,当所有 10 个线程完成此调用时,它们都可以自由地继续执行。但是,这将要求线程能够修改屏障需要解除阻塞的线程数。我不知道这是否可以安全地修改。

此外,我想保证所有仍在工作的线程不会像使用屏障那样自动启动,我想用 pthread_cond_broadcast 调用手动启动它们。在我进行广播调用之前,我如何保证所有还活着的线程(最好是十个)都阻塞在 condvar 上?

谢谢!

0 投票
2 回答
442 浏览

mpi - MPI_Type_commit 是否隐式调用 MPI_COMM_WORLD 中所有进程的屏障?

在我的代码中,我定义了一个新的 MPI 用户定义数据类型。我想知道 MPI_Barrier 函数是否必须遵循 MPI_Commit 或必须放置在首次使用新数据类型的某个点,以便所有进程都确认并同意新数据类型的定义。

谢谢。

0 投票
2 回答
1054 浏览

java - java中具有动态参与方数量的障碍

我想要一个在java中具有动态数量的参与者的障碍。我遇到了Phaser,但这个解决方案适用于我无法使用的 java 7。

java 6是否有一些解决方案。我应该如何满足具有可变数量服务员的障碍的需求?

0 投票
1 回答
2316 浏览

deadlock - Reusable Barrier 解决方案有死锁?

我一直在阅读“信号量小书”,在第 41 页有一个解决可重用障碍问题的方法。我遇到的问题是为什么它不会产生死锁情况。

在这个解决方案中,在第 15 行和第 20 行之间,在持有会导致死锁的互斥体时在信号量(第 18 行)上调用 wait() 不是一个坏习惯吗?请解释。谢谢你。

0 投票
1 回答
733 浏览

webserver - MPI_SEND 在 MPI_BARRIER 之后停止工作

我正在用 C/MPI 构建一个分布式 Web 服务器,在我的代码中的第一个 MPI_BARRIER 之后,点对点通信似乎完全停止工作。标准 C 代码在屏障之后工作,所以我知道每个线程都会通过屏障。点对点通信在障碍之前也可以正常工作。但是,当我将与屏障之前的行相同的代码复制粘贴到屏障之后的行中时,它会完全停止工作。SEND 将永远等待。当我尝试改用 ISEND 时,它会通过线路,但从未收到过消息。我一直在谷歌上搜索这个问题,每个对 MPI_BARRIER 有问题的人都被告知屏障正常工作,他们的代码是错误的,但我终生无法弄清楚为什么我的代码是错误的。

这是一个示例程序,演示了这一点:

将这两个if语句移动到屏障之前会导致该程序正确运行。

编辑- 无论类型如何,第一次通信似乎都有效,并且所有未来的通信都失败了。这比我一开始想的要笼统得多。不管第一次通信是障碍还是其他消息,以后的通信都不会正常工作。

0 投票
2 回答
15133 浏览

c - 在 C 中使用互斥锁和屏障进行线程同步

我正在尝试使用 pthread 互斥变量和屏障来同步我的程序的输出,但它没有按照我想要的方式工作。每个线程每 20 个值(来自 for 循环)看到它的最终值,这没关系,但我试图让它们都达到相同的最终值(如果使用 5 个线程,它们都应该看到 100 作为最终值, 4 线程, 80 等)

非常感谢任何建议或帮助!提前致谢!