问题标签 [pthread-barriers]

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 投票
0 回答
298 浏览

asynchronous - How can I make a thread wait on any barrier in a set of barriers?

In POSIX and Windows API have barriers that allow synchronizing n threads. When n threads waiting for the barrier they may proceed doing some work.

What I want is for threads to wait for a set of barriers. When any of the barriers have n threads waiting it unlocks, returning which one of the barriers that was unlocked. Looking at POSIX and Windows API this is not a part of the native API. Is there another way around it?

Target language is C/C++ but language agnostic solutions are also appreciated.

Bakground: I´m looking into CSP, the basis of Occam and an inspiration source for Go. I believe a runtime can treat Events as barriers. However that would require some way of waiting for multiple barriers. I´d like to getting around this without major effort put in a supervisor.


Edit: Making an example in CSP notation.

For those of you unfamiliar with the syntax, P is a process (thread) interacting with event c, then c again, then d, then works like P. Q works similar. R is defined as c then R or d then SKIP. RUNTIME is the concurrent process made from P, Q and R.

Events are synchronized similar to barriers; all processes must be able to deal with it at the same time for it to happen. The trick is that a process may be able to participate in a set of event such as R which may participate in c or d, but unable to because of other processes (P and Q) not being able to participate.

This is where the "wait for ANY from a SET of barriers" comes in. R may wait for c or d simultaneously, and depending on which one is unlocked will behave differently.

0 投票
1 回答
522 浏览

c++ - 并行计算的障碍

我正在阅读有关障碍的信息,在 Wikipedia 中找到了一个示例。我怀疑它是否正确。这是来自(https://en.wikipedia.org/wiki/Barrier_(computer_science)#Implementation)的代码

在barrier函数中,在进入第一个ifblock之前,先leave_counter比较P是否等于P。再次在else块中,有一个比较。

第二次比较的原因是什么,因为控件仅在leave_counter值为时输入P?我在这里错过了什么吗?

0 投票
0 回答
84 浏览

multithreading - 如何创建一个公平的多线程双屏障?

我有一个双屏障多线程程序正在工作,但我不知道如何创建一个公平机制(使用 POSIX 互斥锁,条件变量屏障函数) - 意思是:线程组将通过到达屏障的时间进入第一个屏障。

到目前为止我拥有的代码的伪代码(总结,原始代码有更多的验证。希望它足够清楚) -

  1. 互斥锁;

  2. ++_barrier->m_predicate;

  3. /* 阻塞所有线程(除了最后一个线程) - 在屏障集合点挂起 */

    if(_barrier->m_predicate != _barrier->m_barrierSize) { pthread_cond_wait(&_barrier->m_cond, &_barrier->m_mutex); }

  4. else { /* *解除阻塞当前被Barrier中cond参数阻塞的所有线程(按调度策略顺序) **Reset: Predicate value is "0" --> 新一批线程
    进入第一个屏障 */

    /* 关键代码块结束 */

    pthread_mutex_unlock(&_barrier->m_mutex);

0 投票
1 回答
430 浏览

java - 如何让线程按照 ID 的顺序开始工作(使用信号量)?

我有 10 个线程,每个线程都有自己的 ID,从 1 到 10;所有线程都有 2 个阶段要做(即 Phase1 和 Phase2)。我试图让所有线程首先完成它们的 Phase1,在任何线程进入 Phase2 之前,使用信号量(我做到了并且效果很好),但是我应该让所有 10 个线程按照它们的 TID(线程 ID)的顺序开始。我尝试了很多方法,但没有得到结果!我得到的最终结果仅适用于前 4 个线程(有时是 5 或 6 个),然后其余线程出现顺序混乱!

这些是我创建的信号量:

这是我的线程方法:

turnTestAndSet 方法如下:

其中 siTurn 初始化为 1。

我在代码中遇到的问题(我认为)是,当一个线程到达 While 循环 [while(!this.turnTestAndSet())] 时,它可能会成功跳过循环(如果成功),但另一个线程可能会在前一个线程进入阶段 2 之前启动并执行其 while 循环!因此,siTurn 可能会在任何线程进入阶段 2 之前保持递增。

我知道我应该以更好的方式使用信号量 s2 并尝试从中受益,而不是将其用作互斥体。任何新的解决方案或修复我当前的解决方案?或使用信号量的通用解决方案,以便我可以将其应用于我的代码。

0 投票
2 回答
749 浏览

c - Pthread-barriers 和树莓派

我正在为学校做作业,作业的目标是使用 Pthread Barriers,使树莓派上的 LED 慢慢地从未点亮变为点亮,反之亦然。我是 C 的初学者,我想我理解 pthread sna dn pthread 障碍的概念。

以下是我编写的代码,它应该使 raspPI 中的 LED 从未点亮变为点亮:

在我看来,代码几乎是正确的,但它不起作用,请你帮我找出并解决问题。

错误/警告列表:

0 投票
2 回答
81 浏览

c - 为什么 pthread_barrier_wait 不考虑线程优先级?

我正在使用障碍来同步我的两个线程,这两个线程将分别执行task_1task_2

同步后,我希望优先级较高的任务在优先级较低的任务之前开始执行。

我惊讶地注意到,即使task_2的优先级低于task_1有时task_2 task_1之前开始执行。

这是 POSIX 线程中的预期行为吗?我能做些什么来强制task_1总是在task_2之前开始?

我以 root 身份执行程序,并确保已相应设置任务优先级。

0 投票
2 回答
364 浏览

c - C 中的分段错误(核心转储) - 使用 PTHREADS 时

大家好, 我的代码有问题,我不知道如何解决(分段错误(核心转储))!

所以我的老师要我编写一个程序来创建 N 个踏板并让它们进行一些计算。我有 3 个全局二维数组 A、B、C(我将它们作为指针,因为我不知道大小,用户给它作为论点)。我尝试在主函数中为它们分配内存。

所以问题是当我尝试在“pthread_create(&tid[id],NULL,add,(void *)(long) i);”中创建踏板时出现分段错误 :(。我不知道为什么会这样。我尝试使用 gdb 命令,但结果是问题出在 pthread_create 中。

但是,当我输入评论时,它们正在使用的数组(A,B,C)和 malloc 正在运行(但最终结果为 0)。

我正在使用一个虚拟盒子(如果有帮助的话,里面有 Ubuntu:D)。

以下代码是我到目前为止所写的:

******我知道由于互斥锁和障碍,它会变得有些混乱,但请向我询问更多规格:D.******

谢谢!!!!!!

0 投票
1 回答
786 浏览

c - 使用 pthread 从缓冲区写入和读取

我正在尝试使用 pthread。在下面的代码中,我定义了两个全局变量(arg1 和 arg2),在主函数中,我开始用 1 填充 arg2 的每个元素。我希望 pthread 在 arg2 的第 101 个元素被填充后立即打印它主要的。但是 pthread 什么也没打印。实际上 arg1 的变化并没有跟随 pthread 并且 pthread 假设 arg1 为 0。如何激活 pthread 以便当我在 main 中写入缓冲区时,pthread 同时开始从缓冲区读取?

提前致谢。

0 投票
1 回答
795 浏览

c - 使用 pthread 和同步

我正在编写一个玩具程序来帮助我理解障碍是如何工作的。在程序中,我让每个线程检查一个数组中的元素是否在另一个数组中。我能够让所有线程同时开始搜索,但我想让它们在过滤后全部相遇,以便正确地将任何数字添加到数组中。

如果不这样做,错误的数字可能会添加到数组中。

编辑:有人建议我添加 pthread_barrier_wait(&after_filtering); 在对 filter_threads 的调用中,这似乎起到了作用。现在我知道我必须在 main 和 filter 函数中添加一个等待调用,但我不太了解执行流程以及 main 中的等待调用如何工作。我知道线程函数中的等待可确保所有线程在继续之前到达该点,但不是在线程创建后立即发生吗?这意味着 nums 的值应该是 99 而不是 4、3、8、1?

我尝试在过滤后添加另一个等待调用,但现在程序只是挂起。我怎样才能做到这一点?

0 投票
1 回答
41 浏览

c - pthread_cond_broadcast 的意外行为

基于我昨天的问题,在这里,我编写了一个小代码示例,它启动了一些计数和一些等待线程。等待线程停止pthread_cond_wait,直到它们收到信号。在计数线程完成其任务后发送信号。

等待的线程接收到它们的信号,每个线程打印出其给定的唯一 ID。

我希望所有等待的线程同时接收到信号,以便他们每个人都可以继续执行程序。然而我注意到,输出并不混乱,事实上它们甚至看起来是相当有序的,就像在 FILO 中一样!

现在有很多地方,我可能会出错。

这是我的代码: