barrier相关内容

什么是与`__ASM__Volatile(&Quot;";:&Quot;Memory&Quot;)`等价的C++11原子API

代码库具有定义为__asm__ volatile("" ::: "memory")的COMPILER_BARRIER宏。宏的目的是防止编译器跨障碍对读写进行重新排序。请注意,这显然是编译器障碍,不是处理器级内存障碍。 实际上,这是相当可移植的,因为在汇编模板中没有实际的汇编指令,只有volatile和memory装配器。因此,只要编译器支持GCCS扩展ASM语法,它就应该工作得很好。不过,如果可 ..
发布时间:2022-04-18 09:54:51 C/C++开发

使用信号量实现 N 个进程屏障

我目前正在为之前迭代的操作系统考试进行培训,我遇到了这个问题: 实施“N 流程屏障",即是,确保每个过程出来一群人在等待,在某些点在其各自的执行,对于其他进程达到他们的给定点. 你有以下可用的操作: init(sem,value)、wait(sem)和signal(sem) N 是一个任意数字.我可以使它适用于给定数量的进程,但不适用于任何数量. 有什么想法吗?用伪代 ..

GCC内联汇编器“内存"Clobber 不会阻止重新排列 ARM 中的代码

我阅读了关于 GCC 内联汇编器的文章(http://www.ethernut.de/en/documents/arm-inline-asm.html). 在本文中,“内存"Clobber 强制编译器存储所有在执行汇编程序之前缓存值并在执行汇编程序后重新加载它们指示.并且必须保留顺序. 这是一个例子.下面的代码打算将 c 与 b 相乘,其中一个或两个可以被中断程序修改.之前禁用中断访问 ..
发布时间:2021-11-17 22:30:31 其他开发

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

我了解 DSB、DMB 和 ISB 是防止指令重新排序的障碍.我也可以为每一个找到很多很好的解释,但很难想象我必须使用它们的情况. 另外,从开源代码中,我不时看到那些障碍,但很难理解为什么要使用它们.举个例子,在Linux kernel 3.7 tcp_rcv_synsent_state_process函数中,有一行如下: if (不太可能(po->origdev))sll->sll_i ..
发布时间:2021-11-17 21:45:14 其他开发

可重用屏障算法

我正在研究“信号量小书"一书中的可重用屏障算法,可在此处http://greenteapress.com/semaphores/downey08semaphores.pdf 谜题在第 31 页(基本同步模式/可重用障碍),我想出了一个“解决方案"(或不是),它与书中的解决方案(两阶段障碍)不同. 这是我每个线程的“代码": # n = 4;线程正在运行# semaphore = n ma ..
发布时间:2021-10-26 18:46:22 其他开发

向已定义的屏障注册新线程

有没有办法向已经预定义的屏障添加线程? 场景:我在某个时间点有 N 个线程,代码声明了 Barrier 以便处理它们. 问题是,有时我可能需要在该屏障实例内处理另一个新线程,但该屏障已经仅用 N 个线程声明. 示例: barrier = new Barrier(N, (sprint) => {Console.WriteLine($"当前冲刺:{sprint.CurrentPha ..
发布时间:2021-06-04 20:47:02 C#/.NET

为什么Boost库在实现线程屏障时会使用m_generation变量?

boost库(在C ++ 11标准之前)提供了对线程的支持.作为支持的一部分,它还提供了“屏障"的实现,这是一个允许同步的简单类.引用提升网站: “屏障是一个简单的概念.也称为集合点,它是多个线程之间的同步点.屏障针对特定数量的线程(n)配置,并且当线程到达屏障时,它们必须等待直到所有n个线程都到达了.第n个线程到达屏障后,所有等待的线程都可以继续执行,并且屏障被重置." 从Boost ..
发布时间:2021-04-15 20:49:57 C/C++开发

GCC内联汇编程序的“内存"Clobber不会阻止重新排列ARM中的代码

我阅读了有关GCC内联汇编器的文章( http://www.ethernut.de/en/documents/arm-inline-asm.html ). 在本文中,“内存" Clobber强制编译器存储所有在执行汇编程序之前先缓存值,然后在执行后重新加载它们指示.并且必须保留顺序. 这是示例.以下代码旨在将c乘以b,其中一个或两个都乘以b可以通过中断例程进行修改.禁用中断之前访问变量 ..
发布时间:2021-04-09 19:27:10 其他开发

NSOperationQueue中的屏障操作

如何使用NSOperationQueue或基于NSOperationQueue的任何用户定义的数据结构实现dispatch_barrier_async的等效行为? 要求是,每当提交 barrier操作时,它都应等到之前提交的所有 non-barrier操作完成执行并阻止此后提交的其他操作. /p> 无障碍操作应该能够同时执行. 屏障操作应按顺序执行. 注意:不使用 GCD ,因为它 ..

为什么C ++ 20障碍中存在单独到达和等待?

C ++ 20 std :: barrier 具有 arrive_and_wait 方法,几乎​​每个同步屏障实现都具有这种方法。 分别有到达和等待。为什么存在这些功能? 解决方案 好,所以您有一堆必须进行某种同步的线程任务。这些任务分为多个阶段:一个阶段的任务将使用上一个阶段的任务所产生的数据,并且所有下一个阶段的工作必须在下一个阶段的工作开始之前完成。需要来自前一阶段的数据的任何 ..
发布时间:2020-09-28 03:05:14 C/C++开发

ARM中障碍(DSB,DMB,ISB)的实际使用案例

我知道DSB,DMB和ISB是阻止指令重新排序的障碍. 我还可以为它们中的每一个找到很多很好的解释,但是很难想象我必须使用它们的情况. 此外,从开源代码中,我不时看到这些障碍,但是很难理解为什么使用它们.仅作为示例,在Linux内核3.7 tcp_rcv_synsent_state_process函数中,有一行如下: if (unlikely(po->origdev)) ..
发布时间:2020-09-07 02:23:44 其他开发

自旋锁是否总是需要内存屏障?在内存屏障上旋转是否昂贵?

我写了一些无锁代码,可以在本地使用 在大多数情况下都可以读取. 在内存上进行局部旋转是否必然意味着我 必须始终在旋转之前插入存储屏障 阅读吗? (为验证这一点,我设法产生了一个读取器/写入器 导致读者永远看不到 书面价值,在某些非常具体的情况下 条件-专用CPU,附加到CPU的进程, 优化器一路调高,没有其他工作 循环-箭头确实指向该方向,但我不是 完全确定通过内存旋转的成本 障碍.) ..
发布时间:2020-07-08 19:43:53 其他开发

使用信号量实现N个过程障碍

我目前正在使用以前的迭代训练OS考试,并且碰到了这一点: 实施"N个过程障碍",即 是,请确保每个流程都已完成 他们中的一组在等待 指出其各自的执行情况, 其他过程达到他们的 给定点. 您具有以下内容 可用的操作: init(sem,value), wait(sem) and signal(sem) N是任意数字.我可以做到这一点,以使其适用于给定数量的进程,而不适用于任何 ..

在OpenCL中,相对于barrier(),mem_fence()的作用是什么?

与barrier()(我想我理解)不同,mem_fence()不会影响工作组中的所有项目.对于mem_fence(): ,OpenCL规范说(第6.11.10节): 命令加载和存储执行内核的工作项. (因此它适用于单个工作项). 但是,与此同时,在第3.3.1节中,它表示: 在工作项内存中具有加载/存储一致性. 在一个工作项之内,内存是一致的. 那么mem_f ..
发布时间:2020-05-20 18:55:18 其他开发

同步线程以进行pthread_cond_broadcast调用

我有一个带有“管理器"线程的简单应用程序,它产生了十个简单的“工人"线程.我希望所有“工作者"线程都在同一条件变量(即condvar)上阻塞,并且我想通过pthread_cond_broadcast调用手动通知所有十个线程同时唤醒. 在我的应用程序中,线程可能会遇到错误情况并提早终止,因此有可能不是所有十个线程都将其到达同步点. 一种简单的机制是创建一个pthread_barrier_ ..
发布时间:2020-05-14 02:16:07 其他开发

我是否需要内存屏障来访问由完成的线程修改的内存?

[此后,C ++术语] 我有一个线程A和线程B共享对整数值P的访问.线程A初始化该值并在运行时更新它.然后线程A完成.线程B等待线程A完成(标准OS API调用,无论使用哪种操作系统),并希望读取P. 线程B是否需要一个内存屏障来读取由线程A设置的最后一个连贯的P值?当OS API说“线程A完成"时,它修改的内存更改是否可能对其他线程不可见? 请注意,这里只有个线程在其中写入值, ..
发布时间:2020-05-14 00:51:18 C/C++开发