问题标签 [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.
c - 一旦 pthread_barrier_wait 返回,障碍如何被销毁?
这个问题基于:
以及最近的 glibc 错误报告:
http://sourceware.org/bugzilla/show_bug.cgi?id=12674
pthread_barrier_wait
我不确定 glibc 中报告的信号量问题,但根据上面的链接问题,一旦返回,大概应该是有效的破坏屏障。(通常,得到 的线程PTHREAD_BARRIER_SERIAL_THREAD
,或者已经认为自己对屏障对象“负责”的“特殊”线程将是破坏它的线程。)我能想到的主要用例是当屏障用于在创建线程的堆栈上同步新线程对数据的使用,防止创建线程返回,直到新线程开始使用数据;其他障碍的生命周期可能与整个程序的生命周期相同,或者由其他一些同步对象控制。
在任何情况下,实现如何pthread_barrier_wait
确保在任何线程中返回时,屏障的破坏(甚至可能取消其所在内存的映射)是安全的?似乎其他尚未返回的线程需要检查屏障对象的至少一部分以完成它们的工作并返回,就像上面引用的 glibc 错误报告sem_post
中必须检查调整后的服务员计数一样信号量值。
linux - 关于 pthread_barrier_wait
我正在使用 pthread_barrier_wait 来同步线程,但在我的程序中,有可能一个或多个线程到期,而其他线程正在等待它们到达 pthread_barrier_wait。现在有没有办法让卡在 pthread_barrier_wait 的线程知道一些线程已经过期,而所有线程都已经到达屏障?
web-applications - 客户端-服务器开发人员在理解 Web 应用程序/开发方面面临哪些障碍?
你们是否愿意阐明客户端-服务器程序员面临(必须克服)才能理解(并能够转向)Web应用程序编程的困难?
想想一个已经编写 Windows 窗体客户端-服务器数据库应用程序至少 10 年的人。
operating-system - 使用信号量实现 N 个进程屏障
我目前正在为之前迭代的操作系统考试进行培训,我遇到了这个问题:
实施“N 个进程屏障”,即确保一组进程中的每个进程在其各自执行的某个时间点等待其他进程到达它们的给定点。
您有以下可用操作:
init(sem,value), wait(sem) and signal(sem)
N 是任意数。我可以使它适用于给定数量的进程,但不适用于任何数量。
有任何想法吗?用伪代码回复就可以了,这不是作业,只是个人学习。
linux - Linux上的内存屏障和atomic_t
最近在看一些Linux内核空间代码,看到这个
这个代码片段的语义是什么?它是否确保 #1 在 #3 之前由 #2 执行。但我有点困惑,因为
#A在 64 位平台,atomic64_read 宏扩展为
在 32 位平台中,它被转换为使用 lock cmpxchg8b。我假设这两个具有相同的语义,对于 64 位版本,我认为这意味着:
- all-or-nothing,我们可以排除地址未对齐且字长大于 CPU 原生字长的情况。
- 没有优化,强制 CPU 从内存位置读取。
atomic64_read 没有保留读取顺序的语义!!!看到这个
#B屏障宏定义为
从wiki 这只是防止gcc 编译器重新排序读取和写入。
我很困惑的是它如何禁用 CPU 的重新排序优化?另外,我可以认为屏障宏是完整的围栏吗?
lock-free - 自旋锁总是需要内存屏障吗?在内存屏障上旋转是否昂贵?
我写了一些无锁代码,在大多数情况下都可以很好地处理本地读取。
本地旋转内存读取是否一定意味着我必须始终在旋转读取之前插入内存屏障?
(为了验证这一点,我设法生成了一个读写器组合,这导致在某些非常特定的条件下——专用 CPU、附加到 CPU 的进程、优化器一直打开、没有其他工作,读者永远看不到写入的值在循环中完成——所以箭头确实指向那个方向,但我不完全确定旋转通过内存屏障的成本。)
如果缓存的存储缓冲区中没有要刷新的内容,那么旋转通过内存屏障的成本是多少?即,所有过程正在做(在C中)是
我是否正确地假设它是免费的并且它不会用任何流量阻碍内存总线?
另一种说法是问:内存屏障除了刷新存储缓冲区、对其应用无效以及防止编译器在其位置重新排序读取/写入之外,还有什么作用吗?
反汇编, __sync_synchronize() 似乎转化为:
来自英特尔手册(对于新手来说同样模糊):
我的翻译:“当你说 LOCK 时,这会很昂贵,但我们只在必要时才这样做。”
@BlankXavier:
我确实测试过,如果写入器没有明确地从存储缓冲区中推出写入,并且它是该 CPU 上运行的唯一进程,那么读者可能永远看不到写入器的效果(我可以使用测试程序重现它,但是正如我上面提到的,它只发生在特定的测试中,具有特定的编译选项和专用的核心分配——我的算法工作正常,只有当我对它的工作原理感到好奇并编写了我意识到它可能具有的显式测试时一个问题在路上)。
我认为默认情况下简单的写入是 WB 写入(回写),这意味着它们不会立即被刷新,但读取将采用它们的最新值(我认为他们称之为“存储转发”)。所以我为作者使用了 CAS 指令。我在 Intel 手册中发现了所有这些不同类型的写入实现(UC、WC、WT、WB、WP),Intel vol 3A 第 11-10 章,仍在学习它们。
我的不确定性在于读者方面:我从 McKenney 的论文中了解到,还有一个失效队列,一个从总线到缓存的传入失效队列。我不确定这部分是如何工作的。特别是,您似乎暗示循环通过正常读取(即,非锁定,没有障碍,并且仅使用 volatile 以确保优化器在编译后离开读取)每次都会检查“无效队列” (如果存在这样的事情)。如果一个简单的读取不够好(即可以读取一个旧的缓存行,它仍然显示为有效等待队列失效(这对我来说也有点不连贯,但是失效队列是如何工作的呢?)),那么原子读取将是必要的,我的问题是:在这种情况下,这会对公共汽车有什么影响吗?(我认为可能不会。)
我仍在阅读英特尔手册,虽然我看到了关于存储转发的精彩讨论,但我还没有找到关于失效队列的很好讨论。我决定将我的 C 代码转换为 ASM 并进行实验,我认为这是真正了解其工作原理的最佳方式。
c# - c# 障碍和异常处理
我创建了使用障碍的简单 c# 示例,并且在其中一个函数中引发了异常,并且得到了意外的结果
现在正如您在代码中看到的那样,我在DoWork1
方法中抛出了一个异常,我希望所有 3 个方法都会处理异常,但只有第一个方法可以,第二个问题是只有第一个方法打印“阶段 3 bla bla”,我希望所有 3他们将其打印到控制台。有人可以解释一下为什么会发生这种情况
代码有点长,但大部分只是复制粘贴
c - MPI_Barrier 在循环中不起作用
我已经对 MPI 函数进行了一些测试,以了解它是如何工作的,并且使用 MPI_Barrier 得到了一个奇怪的结果:如果我在代码中使用它,它会满足每个人的期望
但是当我从循环内部调用它时,我会得到随机结果。具体来说,我有以下测试代码:
当我用 3 个任务运行它时,我随机得到:
这是我所期望的,或者只是相反的:
或者介于两者之间的东西,比如
谁能告诉我 MPI_Barrier 和循环之间是否存在冲突?(我只发现了在不同任务中使用不同大小的循环来避免死锁的警告。)如果有,我能做些什么来强制任务在开始循环的新迭代之前相互等待?如果没有,这段代码有什么问题?
谢谢!
c# - 如何在 .NET 3.5 中从 .NET 4 功能实现 Barrier 类
由于某些原因,我必须坚持使用 .NET 3.5,并且我需要 .NET 4 中的 Barrier 类的功能。我有一堆线程在做一些工作,我希望它们互相等待,直到全部完成。当一切都完成后,我希望他们以类似的方式一次又一次地完成这项工作。C# 4.0 中的 Barrier 和 C# 3.0 中的 WaitHandle 之间的线程差异的鼓励?我决定使用 AutoResetEvent 和 WaitHandle 类来实现 Barrier 功能。尽管我的代码遇到了问题:
我收到的输出如下:
'barrier' 处的线程 0 将休眠 7564 'barrier' 处的线程 1 将休眠 5123 'barrier' 处的线程 2 将休眠 4237 'barrier' 处的线程 2 与时间 4237'barrier'处的线程 1时间为 5123 线程 0 在“屏障”,时间为 7564 线程 0 在“屏障”将休眠 8641 线程 0 在“屏障”,时间为 8641
就是这样。在最后一行之后没有更多的输出并且应用程序不会终止。看起来有某种僵局。但是找不到问题。欢迎任何帮助。
谢谢!
c - 可以在 Linux 上实现正确的故障安全进程共享屏障吗?
在过去的一个问题中,我询问了如何在没有破坏竞赛的情况下实现 pthread 屏障:
一旦 pthread_barrier_wait 返回,障碍如何被销毁?
并从 Michael Burr 那里收到了针对流程本地障碍的完美解决方案,但对于流程共享障碍却失败了。后来我们摸索了一些想法,但始终没有得出令人满意的结论,甚至没有开始涉足资源故障案例。
是否可以在 Linux 上制作满足这些条件的屏障:
- 进程共享(可以在任何共享内存中创建)。
- 在屏障等待函数返回后立即从任何线程取消映射或销毁屏障是安全的。
- 由于资源分配失败,不能失败。
Michael 解决进程共享案例的尝试(请参阅链接的问题)有一个不幸的属性,即必须在等待时分配某种系统资源,这意味着等待可能会失败。并且不清楚当屏障等待失败时调用者可以合理地做什么,因为屏障的全部意义在于在剩余N-1
线程到达它之前继续进行是不安全的......
内核空间解决方案可能是唯一的方法,但即使这样也很困难,因为信号可能会中断等待而没有可靠的方法来恢复它......