- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
查看 Barrier
类,它允许 n
个线程在某个时间点会合:
static Barrier _barrier = new Barrier(3);
static void Main()
{
new Thread(Speak).Start();
new Thread(Speak).Start();
new Thread(Speak).Start();
}
static void Speak()
{
for (int i = 0; i < 5; i++)
{
Console.Write(i + " ");
_barrier.SignalAndWait();
}
}
//OUTPUT: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
但是 CountdownEvent
类也是如此:
static CountdownEvent _countdown = new CountdownEvent(3);
static void Main()
{
new Thread(SaySomething).Start("I am thread 1");
new Thread(SaySomething).Start("I am thread 2");
new Thread(SaySomething).Start("I am thread 3");
_countdown.Wait(); // Blocks until Signal has been called 3 times
Console.WriteLine("All threads have finished speaking!");
}
static void SaySomething(object thing)
{
Thread.Sleep(1000);
Console.WriteLine(thing);
_countdown.Signal();
}
// output :
I am thread 3
I am thread 1
I am thread 2
All threads have finished speaking!
所以看起来 Barrier
阻塞直到 n
线程相遇而 CountdownEvent
也在阻塞,直到 n
线程发出信号。
(对我来说)从中学习有点困惑,我什么时候应该使用哪个。
问题:
在哪种(现实生活场景)中我应该选择使用 Barrier
而不是 CountdownEvent
(反之亦然)?
最佳答案
关于这两者有一些有趣的事情需要注意:
CountdownEvent
没有与之关联的显式后操作; Barrier
可以。 CountdownEvent
和一个具有一个阶段的 Barrier
大致等效,因此可以互换使用。Barrier
可以有多个阶段。当每个阶段完成时,执行阶段后操作;该操作完成后,下一阶段开始。有一个similar question在讨论此行为的 SO 上,但针对 C# 类的 Java 等价物。答案提供了几个示例,这些示例对 C# 等效项有效。
也就是说,考虑一个现实世界的场景:检查 3 个信贷来源以寻找向购房者提供的潜在贷款。假设您在收到所有 3 个信用评分并对其进行评估之前不想做出决定。您可以使用 CountdownEvent
(使用 Wait()
之后的代码检查分数)或使用带有分数检查代码操作的单相屏障。
这里 Barrier
是更好的选择:假设信贷员还想检查购房者的 SO 声誉评分(因为专业用户获得更好的信用!)和其他两个社会评分,但是只有在检索到信用评分之后(因为嘿,如果我们不需要的话,我们不想检查社交媒体)。
Barrier
的巧妙之处在于,您可以在单个方法调用中完成各个阶段,从而保持逻辑紧凑和整洁:
var barrier = new Barrier(participantCount: 3, b => LogScoreAndPossiblyEvaluate(b));
var credit = new int[3];
var social = new int[3];
void LogScoreAndPossiblyEvaluate(Barrier b)
{
Log.Info("Got scores for {b.CurrentPhaseNumber == 1 ? "credit" : "social"} phase");
...
if (b.CurrentPhaseNumber == 2 && SomeComplexCalculationWithSixScores() == LoanResult.Approved)
LoanMoney();
}
...
for (int i=0; i<3; i++)
Task.Run(() => {
credit[i] = GetCreditScore(CreditSource(i);
barrier.SignalAndWait();
social[i] = GetSocialScore(SocialSource(i);
barrier.SignalAndWait();
// all phases done at this point
});
关于c# - CountdownEvent 与 Barrier 的多线程用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52521986/
我是 Barrier-kvm 的常客。我最近将我的服务器升级到 Ubuntu 20.04 并开始收到错误“错误:ssl 证书不存在:/home/rsvay/snap/barrier-kvm/2/.lo
根据维基百科:内存屏障,也称为 membar、内存栅栏或栅栏指令,是一种栅栏指令,它导致中央处理单元 (CPU) 或编译器对在屏障指令。 这通常意味着在屏障之前发出的操作保证在屏障之后发出的操作之前执
我正在尝试使用omp来实现listranking问题(也称为快捷方式),以使数组W的和为前缀。 我不知道我是否正确使用了冲洗编译指示。 而且我在编译时发出警告:“障碍区域可能不会紧密嵌套在工作共享,关
问题 是否允许在发散流控制之后但在发散流控制之外使用 barrier()? 详细信息 在兼容 OpenGL 4.00 的计算着色器中,我正在做一些涉及发散(即非动态统一)分支语句的工作。稍后在同一个着
我想制作一个看起来像这样的布局,但使用 Barrier: 所以我制作了以下 XML: 但是结果是这样的: Barrier 似乎没有向下移动。我做错了什么?
我了解了一些关于 GCD 障碍的知识并想检查这些信息(来自 Apple docs ): Any blocks submitted after the barrier block are not exe
通常,线程屏障(即 boost::barrier)用一个整数初始化,该整数表示必须调用 boost::barrier::wait 的线程数 - 所有线程都在该点等待,直到满足条件,然后所有线程继续。
我正在尝试解决我们的操作系统教授在上一次考试中向我们展示的问题,以便为下一次考试做准备。 问题是有两个线程同时执行并且可能在不同的时间内完成。一个特定的线程完成后,它需要阻塞直到另一个线程完成,然后它
我正在研究测试驱动开发,其中一个讨论点是与 TDD 相关的“进入壁垒”。有没有人在这方面有任何经验,在您参与的任何项目中,由于进入阈值太高而决定不使用 TDD? 据我所知,进入的唯一障碍是个人开发人员
如何使用类成员函数初始化 std::barrier ? class CMyClass { private: void func() { } public: void start
作为类(class)作业的一部分,我必须使用锁来实现自定义屏障类。为了测试我的 LockBarrier 类,我想出了以下测试代码。它工作正常,但我担心这是否是正确的方法。您能否建议我可以做的改进,特别
最近在看页面The JSR-133 Cookbook for Compiler Writers由 Doug Lea 关于 JSR 133: JavaTM Memory Model and Thread
我想在我的 cpp 多线程代码中使用 std::experimental::barrier。但即使我写这样的代码: #include #include #include int main ()
我目前正在使用 MPI C 库,但是使用 C++ 编码,我知道 MPI_Barrier(MPI_COMM_WORLD) 函数会阻止调用者,直到通信器中的所有进程都调用它 , 如 documentati
在omp临界区之后是否存在隐式omp屏障 例如,我可以将以下代码版本 1 修改为版本 2 吗? 版本-1 int min = 100; #pragma omp parallel { int lo
我不确定这是否在 xcode8 beta 5 中崩溃了。看看这段代码。你认为它应该先打印“A”还是先打印“B”? let q = DispatchQueue(label: "q", attribute
在 Java 中,当我们有两个线程共享以下变量时: int a; volatile int b; 如果线程 1 执行: a = 5; b = 6; 然后在这两条指令之间插入一个 StoreStore
从 Linux 内核代码中,我可以看到 preempt_enable() 和 preempt_disable() 除了 barrier() 之外什么都没有: #define preempt_disab
我有时会在有关内存排序的教程中看到“完全内存屏障”一词,我认为这意味着: 如果我们有以下指示: instruction 1 full_memory_barrier instruction 2 然后,不
我已经阅读了我能找到的所有关于 torch.distributed.barrier() 的文档,但仍然无法理解它在 this script 中的使用方式并且非常感谢一些帮助。 所以official d
我是一名优秀的程序员,十分优秀!