问题标签 [busy-waiting]

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 投票
1 回答
1096 浏览

c++ - 如何有效地等待一组信号量?

我正在使用带有共享内存的信号量在多生产者和多客户端之间进行通信。我的系统中有两种主要的信号量,分别是“存储的信号量”和“处理的信号量”。

系统运行如下:生产者不断地将数据放入共享内存,然后增加存储的信号量的值,而消费者则在循环中,等待存储的信号量。消费者在收到生产者的数据后,会对这些数据进行处理,然后增加处理后的信号量的值。生产者将通过等待“已处理的信号量”来获得结果

生产者代码:

消费者代码:

我的问题是消费者代码中的 for 循环几乎浪费了 100% 的 CPU,因为在没有来自生产者的数据的情况下,这个 for 循环会连续运行。

我的问题是,还有其他方法可以等待一组信号量(可能类似于 SELECT、POLL 或 EPOLL 的等待机制),这不会浪费 CPU 时间。

希望看到你的回答。非常感谢!

0 投票
3 回答
466 浏览

java - Java Puzzler:繁忙的等待线程停止工作

这是某种Java Puzzler,我偶然发现并无法真正解释。也许有人可以?

以下程序在短时间内挂起。有时在 2 次输出之后,有时在 80 次之后,但几乎总是在正确终止之前。如果第一次没有发生,您可能需要运行几次。

现在,很明显,繁忙的等待循环通常不是一个好主意。但这不是关于改进,而是关于了解正在发生的事情。

由于一切都按预期工作,WorkerThread.setWork()或者synchronized当该WorkerThread.workToDo字段设置为时,volatile我怀疑存在内存问题。

但究竟为什么会发生呢?调试无济于事,一旦您开始单步执行,一切都会按预期运行。

解释将不胜感激。

0 投票
2 回答
1749 浏览

c - 如何编写 C 程序以执行一定数量的处理器秒数?

我需要一个 C 程序,它可以在作为参数传入的精确 CPU 秒数内执行。我需要这样一个程序来测试监控进程 CPU 使用率的代码。

例子:

应该在我的处理器上运行 x 秒。

0 投票
2 回答
319 浏览

c++ - 使用 volatile 布尔变量进行忙碌等待

这个问题是在阅读了其他开发人员编写的一些代码后出现的,所以我做了一些研究,发现了 Andrei Alexandrescu 的文章。在他的文章中,他说可以使用 volatile 布尔变量来忙等待(参见第一个示例等待/唤醒)

我真的不明白它是如何工作的。

  1. volatile 不保证操作是原子的。实际上,对布尔变量的读/写是原子的,但理论并不能保证这一点。从我的角度来看,上面的代码可以使用 C++11 安全地重写,方法是使用 std::atomic::load/store 函数和相应的获取/释放内存排序约束。
  2. 在所描述的示例中我们没有这个问题,但是如果我们有不止一个写入,我们可能会遇到内存排序问题。Volatile 不是栅栏,它不强制内存排序,它只是阻止编译器优化。

那么为什么这么多人使用 volatile bool 来忙等待,它真的便携吗?

0 投票
1 回答
94 浏览

matlab - MATLAB 忙,循环运行良好,直到 i=29996,当 i=29997 保持忙碌时

我正在编写比较向量数据的代码。它应该计算有多少位置(acc)具有相等的值,并将特定值保存在与位置数量(n_T(acc))相同长度的向量中。

我的数据向量是 [30000 x 1]。例如,前 80 个位置具有相同的值,接下来的 60 个位置具有相同的值,等等,接下来的 5 个位置具有相同的值。如果我只使用 29996 个值,则代码运行良好。我不明白为什么当我尝试使用完整的向量时,MATLAB 一直很忙。

检查我的数据向量,我注意到最后 5 个位置是等效的 [29996:30000]。可能是原因,我应该改变什么?

以下是代码

0 投票
3 回答
1913 浏览

c++ - 高吞吐量非阻塞服务器设计:繁忙等待的替代方案

我一直在为多媒体消息构建一个高吞吐量的服务器应用程序,实现语言是C++。每台服务器可以独立使用,也可以将多台服务器连接在一起,创建一个基于 DHT 的覆盖网络;服务器就像 Skype 的情况一样,就像超级对等点一样。

工作正在进行中。目前,服务器每秒可以处理大约 200,000 条消息(256 字节消息),并且在我的机器(Intel i3 Mobile 2 GHz、Fedora Core 18(64 位)、4 GB RAM)上的最大吞吐量约为 256 MB/s长度为 4096 字节的消息。服务器有两个线程,一个用于处理所有 IO(基于 epoll,边缘触发),另一个用于处理传入消息。覆盖管理还有另一个线程,但在当前讨论中并不重要。

讨论中的两个线程使用两个循环缓冲区共享数据。线程 1 使用一个循环缓冲区为线程 2 排队新消息,而线程 2 通过另一个循环缓冲区返回处理后的消息。服务器完全无锁。我没有使用任何同步原语,甚至没有使用原子操作。

循环缓冲区永远不会溢出,因为消息是池化的(在开始时预先分配)。事实上,所有重要/经常使用的数据结构都被池化以减少内存碎片并提高缓存效率,因此我们知道在服务器启动时我们将要创建的最大消息数,因此我们可以预先计算最大值缓冲区的大小,然后相应地初始化循环缓冲区。

现在我的问题:线程 #1 一次将序列化消息排入队列(实际上是指向消息对象的指针),而线程 #2 以块的形式从队列中取出消息(32/64/128 的块),然后返回通过第二个循环缓冲区以块的形式处理消息。如果没有新消息,线程 #2 会一直忙于等待,从而使 CPU 内核之一一直处于忙碌状态。如何进一步改进设计?忙碌等待策略的替代方案是什么?我想优雅而高效地做到这一点。我考虑过使用信号量,但我担心这不是最好的解决方案,原因很简单,每次我在线程 #1 中排队一条消息时都必须调用“sem_post”,这可能会大大降低吞吐量,第二个线程必须调用“sem_post”等于防止信号量溢出的次数。另外我担心信号量实现可能在内部使用互斥锁。

第二个不错的选择可能是使用信号,如果我可以发现仅当第二个线程“清空队列并且正在调用 sigwait”或“已经在 sigwait 上等待”时才发出信号的算法,简而言之就是信号必须至少提高几次,尽管如果信号的提高次数比需要的多几次也不会受到伤害。是的,我确实使用了 Google 搜索,但我在 Internet 上找到的解决方案都不令人满意。以下是一些注意事项:

A. 服务器在进行系统调用时必须浪费最少的 CPU 周期,并且必须使用最少的系统调用次数。

B. 必须有非常低的开销并且算法必须是高效的。

C. 没有任何锁定。

我希望所有选项都摆在桌面上。

这是我共享服务器信息的网站的链接,以便更好地了解其功能和目的:www.wanhive.com

0 投票
2 回答
11545 浏览

java - 线程:忙等待 - 空 While-Loop

在大学的课程中,我们学习Threads并使用了“忙着等待”的方法来举例说明CarTrafficLight. 对于这个任务,我们构建了三个类:

  • TrafficLight (implements Runnable)
  • Car (implements Runnable)
  • Main

在我们的Main班级中,我们开始两个Threads,一个Car,和一个TrafficLight。具有Car布尔属性hasToWait。此类中的run()方法的工作方式是,while只要hasToWait == true. 为了改变这一点,我们notifyCar()在类中有一个方法,CarTrafficLight. 中的run()方法TrafficLight运行一个Thread.sleep()来模拟一定的等待时间。

在我的教授那里一切正常,但最终我遇到了严重的问题。只要类中的while循环Car为空。当我输入一个空的System.out.println()-时,它可以工作。但如果 Syso 为空,则结果是不显示该方法的 Text。当in为时它也可以工作。比它适用于空循环。RunThread.sleep()TrafficLight0while

这是我的代码:

汽车.java:

交通灯.java:

主.java:

问题出在哪里?为什么它在我的教授上有效,但在我的电脑上无效?我在我的 Eclipse Juno 中得到了 1:1 的代码,使用JRE 1.7

0 投票
3 回答
2398 浏览

javascript - 忙碌等待的替代方案

我有一个 javascript-Function 问题,我无法使用回调函数。

该函数获取“命令”列表,并对其进行迭代。它一个接一个地执行一个命令。为此,我必须使用带有回调的递归函数。

这是一个描述它的例子:

这就是我调用函数的方式:

它工作得很好,一个命令在前一个命令之后执行。

我的问题:

该列表包含数千个元素,并且该列表甚至有可能在处理过程中获得新命令。我在几秒钟内达到了最大的调用堆栈。

我不需要调用堆栈。当我完成最后一个命令时,只有数千个返回,这引导我回到启动一切的函数。

我不知道如何解决这个问题,也不想使用忙等待(这使得代码效率极低)。

还有什么技巧吗?喜欢信号还是破坏调用堆栈?

编辑:

这是一个用于演示的 jsFiddle:http: //jsfiddle.net/db6J8/ (注意,您的浏览器选项卡可能会冻结/崩溃)

错误消息是Uncaught RangeError: Maximum call stack size exceeded

我用 Chrome 测试过,你可能需要在其他浏览器中增加 Array(IE 有一个巨大的 Callstack)。

编辑2:

感谢您的帮助,我不知道添加/删除超时之间的区别。悬停,它不能解决我的问题。这里有更多细节: 我有不同的命令。有些命令是同步的,有些是异步的。所以我必须使用回调函数,但调用堆栈仍然存在问题。

这是一个更新的示例:

还有小提琴:http: //jsfiddle.net/B7APC/

0 投票
1 回答
1053 浏览

concurrency - 在睡眠时超时,但在忙等待时不超时

在 Go 中,我可以用来time.After使睡眠函数超时,但我不能对忙于等待(或工作)的函数做同样的事情。下面的代码timed out在一秒钟后返回,然后挂起。

为什么在第二种情况下超时不会触发,我需要使用什么替代方法来中断正在工作的 goroutine?

0 投票
1 回答
482 浏览

multithreading - 方案中的线程和忙等待

我正在编写一个计划程序,允许用户创建遵循万有引力定律的行星。对于分配,我必须更改代码以避免忙于等待,并为每个行星或每次单击鼠标时创建一个新线程。我对方案中的 GUI 没有很好的理解,非常感谢您的帮助。

这是代码: