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

objective-c - NSOperationQueue 中的屏障操作

我们如何使用或基于任何用户定义的数据结构来实现dispatch_barrier_async等效的行为?NSOperationQueueNSOperationQueue

要求是,每当提交屏障操作时,它应该等到之前提交的所有非屏障操作完成执行并阻止之后提交的其他操作。

  • 非屏障操作应该能够同时执行。
  • 屏障操作应该串行执行。

注意:不使用GCD,因为它不提供(或至少难以)对操作的太多访问,例如取消单个操作等。

0 投票
1 回答
186 浏览

java - 在java中的线程之间共享方法局部变量值

我的任务是找到共享方法的方法,涉及多个线程,局部变量,因此它的值对于运行此方法的每个线程都是可见的。

现在我的代码看起来像这样:

}

所以任务是替换类成员

使用方法的 waitBarrier 局部变量,因此它的值对所有线程都是可见的。

有什么建议么?甚至可能吗?提前致谢。

0 投票
1 回答
182 浏览

java - CyclicBarrier:导致屏障跳闸“y”的“x”个线程完成它们的执行并终止

我有一个 CyclicBarrier,当有“x”个方(线程)等待它时,它会跳闸。在这些“x”线程中,“y”的生命周期非常短,并且在成功完成执行后会很快终止。现在,屏障一直在等待并超时,因为它一直在等待“x”个线程。我该如何解决这个问题?

现在说 task1,调用 write() 5 次,task2 调用 write 500 次。然后 task1 将在遇到障碍 5 次后终止,但 task2 将继续运行。

0 投票
0 回答
894 浏览

performance - 使用一个内核的 OpenCL 高斯卷积速度较慢

我使用两个 1D 高斯滤波器(高斯可分性)在 OpenCL 上实现了 2D 高斯滤波器。

我实现了我的卷积的 2 个版本: - 第一个使用一个内核,在行上应用一维滤波器,然后转置图像(大约需要 20 毫秒)

  • 第二个使用两个内核:一个应用卷积,一个转置图像(大约需要 7ms - 卷积和大约 1ms - 转置图像)

我评估了两种实现的计算时间,我发现使用两个内核的实现比使用一个内核的实现要快(注意转置内核必须等待卷积内核)。

你能帮我弄清楚为什么使用一个内核的实现会更慢,即使一个内核的设置时间应该比两个内核的设置时间快。

在下面找到这两种实现的 OpenCL 源代码:

  • 一个内核实现

    /li>
  • 两个内核实现

    卷积:

    转置:

    /li>
0 投票
1 回答
542 浏览

java - 并发解谜:Java Concurrency - Cyclicbarrier。正确用法?

我正在尝试编写一个程序来解决两个无法独立解决但具有相同解决方案的难题。我的想法是它们都在一个单独的线程中运行,直到它们停止寻找新的信息。然后他们通过更新一些共享状态变量来传达他们发现的内容,并在其中任何一个写入共享状态时继续。

我认为 CyclicBarrier 是在这里使用的适当机制。这是我的代码(在 2 个线程中同时运行:

ThreadsUpdatedSomething 是一个共享整数,如果线程更新了任何内容,则在“ShareUpdates()”中递增。当两个线程在迭代中都没有找到任何新的东西时,这意味着它们永远不会找到任何新的东西,并且应该为两个线程停止整个循环。这就是为什么我要检查它是否为零。

当两个线程都没有在共享状态变量中写入任何新信息时,我希望它们都停止。但是在运行程序时,其中一个线程停止,而另一个线程继续运行。调试程序并在“readUpdates()”行设置断点时,程序按预期工作。

这是处理这种并发“解决”循环的正确方法吗?如果它是正确的,我的代码中的错误在哪里?

谢谢您的帮助!

编辑:纠正了小错误。'更新 = 线程更新的东西;' 现在在正确的地方

0 投票
3 回答
1694 浏览

java - 使用 CyclicBarrier 的 Java 循环线程

我有一个具有这种一般结构的程序:

我的问题是我需要线程的 run() 方法保持循环,直到满足某个条件,但在每次迭代后暂停以让所有线程同步。

我已经尝试将 Runnable 方法附加到屏障,但这最终需要重新创建和重新启动每个线程,这不是一个很好的解决方案。

我也尝试过使用 CyclicBarrier 的 reset() 方法,但这似乎只会导致现有线程出错,即使在所有线程完成后执行也是如此。

我的问题是:

- 是否可以“重置”一个屏障并让所有屏障的线程遵循与第一次调用 await() 之前相同的条件?

-或者我应该使用另一种方法来实现这一目标吗?

提前致谢

0 投票
1 回答
283 浏览

c# - 线程障碍问题 - PulseAll 未到达所有线程

我有一个并行算法,我遇到了一些障碍问题。在你们都尖叫“搜索”之前,我可以说我已经查看了可用的帖子和链接,并且我已经按照 Monitor.Wait 和 Monitor.PulseAll 的屏障说明进行操作,但我的问题是除了最后一个线程之外的所有线程都创建了(并启动) PulseAll 从我的主线程到达。以下是代码的基本布局:

这就是主线程所做的(删除了一些不必要的部分),并且如前所述,主线程将始终卡在列表中最后一个线程的 Join() 中。这是线程方法的样子:

我可以为这种类型的信号使用任何其他障碍吗?我想要的只是让主线程同时向所有线程发出信号,以便它们同时启动。我希望它们同时启动,以便尽可能接近并行(我测量算法的运行时间和其他一些事情)。我的障碍或代码的任何部分是否有缺陷(我的意思是障碍)?我尝试运行一个线程较少的实例,但它仍然卡在最后一个实例上,我不知道为什么会这样。我已经通过 VS debug 确认最后一个线程正在休眠(所有其他线程都是 !isAlive,而最后一个是 isAlive = true)。任何帮助表示赞赏!

0 投票
3 回答
12960 浏览

multithreading - 在 C++11 中实现 boost::barrier

我一直在尝试让一个项目摆脱每个 boost 引用并切换到纯 C++11。

在某一时刻,线程工作者被创建,等待屏障发出“go”命令,完成工作(通过 N 个线程传播)并在所有线程完成时同步。基本思想是主循环给出执行顺序(boost::barrier.wait())并用相同的函数等待结果。

我在另一个项目中实现了一个基于 Boost 版本的定制屏障,一切正常。实施如下:

屏障.h:

屏障.cpp

此代码已在 iOS 和 Android 的 NDK 上使用,没有任何问题,但在 Visual Studio 2013 项目上尝试时,似乎只有锁定互斥锁的线程才能解锁它(断言:解锁无主互斥锁)。

是否有任何可用于 C++11 的非旋转(阻塞,例如这个)屏障版本?我只能找到使用忙等待的障碍,这是我想阻止的(除非真的没有理由这样做)。

0 投票
1 回答
419 浏览

multithreading - 内存屏障和互斥锁

给定两个线程之间的通用消息传递模式:

问:如果'M1'是一个通用互斥体,当使用C++或C实现软件时,Thread-B是否总是保证有正确的'Msg'内容?问:这种模式对于操作系统和/或处理器配置的某些组合是否不能正常工作?(我主要关注 Linux、Windows、Mac OS X、VxWorks、Green Hills 和 Micrium 等操作系统)

我的理解(可能不正确)是,通过锁定和/或解锁互斥锁“M1”实现的关键部分将导致执行内存屏障/栅栏指令,这将确保处理器/核心缓存的一致性;因此 Thread-B 保证读取 'Msg' 的正确内容。但是,我很难找到表明上述“一般模式”是正确的权威文档。

0 投票
1 回答
2507 浏览

c# - 屏障类 c#

我确实了解BarrierC# 中使用的类。但是,在下面的代码中,我不明白为什么SignalAndWait()被调用了两次?任务中的调用还不够吗?该代码基本上模拟了三个朋友(或任务)从 A 到 B,B 到 C,有些从 B 回到 A 而没有去 C 的情况。请帮帮我。顺便说一句,这段代码来自书中:MCSD Certification Exam Toolkit(70-483)。非常感谢!