问题标签 [single-threaded]
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.
multithreading - 单线程能做多线程能做的一切吗?
我的第一个问题:根据标题。
我之所以问这个问题是因为我遇到了一个 StackExchange 问题:多个线程可以做哪些单线程不能做的事情?
在该链接中给出的解决方案之一中,无论多线程可以做什么,它也可以由单线程完成。
然而我不认为这是真的。我的论点是:当我们用套接字编程构建一个简单的聊天程序并通过命令控制台运行它时。如果聊天程序是单线程的。聊天程序实际上是半双工的。这意味着我们不能同时听和说,每次只有一方可以说话,另一方必须听。为了让双方能够同时交谈和接收消息,我们必须用多线程来实现它。
我的第二个问题:我的论点正确吗?还是我在这里遗漏了一些要点,因此单个线程仍然可以完成多线程所做的一切?
event-loop - nodeJS - 无法理解代码的行为
上面的代码是一个nodejs代码,它的输出应该是:
但我得到这样的输出:
我在单线程和异步回调的概念中的某个地方出错了。请有人解释一下代码是如何工作的。
javascript - 如何处理竞争条件
我对网络开发很陌生。从我读到的关于竞争条件的内容中,我认为使用 node 或 JS 是不可能的,因为它是单线程的,但我认为那是..我猜错了。通过这个小例子,有人可以解释它是如何工作的。
如果有一个银行账户,里面有 1000 美元,并且两个人在同一秒同时访问服务器时从账户中扣款。第一个人收费 600 美元,第二个人收费 200 美元。
第一次收费为 1000 美元至 600 美元,余额为 400 美元。但是由于第二次收费是在同一时间发生的,所以它会产生 1000 美元到 200 美元的费用,而余额则为 800 美元。显然,余额现在应该是 200 美元。
据我了解,这会导致比赛条件,不是吗?你将如何设置它来避免这个问题?我不需要确切的代码,也许有人向我解释这个,或者伪代码。
提前致谢。
编辑:我将编辑它以了解最初如何设置代码导致竞争条件。
就像下面的帖子说的。将设置代码,以便当账户被击中时,它会减去金额并给出新的余额。显然这会导致竞争条件。
windows - 如何自动限制在单个逻辑处理器上运行的批处理文件?
我想自动限制一些(imagemagick 图像处理)批处理作业在单个逻辑处理器上的后台运行,以尽量减少对其他实时应用程序性能的影响。
我拼凑起来的方法是使用命令行参数作为标志。当批处理文件首次启动时没有命令行参数(也没有关联),它将再次启动自身,并将关联设置为最后一个逻辑处理器,添加一个虚拟参数以指示关联已设置并继续执行主体批处理作业:
这似乎在我的 4 核 Win8.1 系统上运行良好,可以将批处理作业限制在最后一个(第 4 个)逻辑处理器上。我的问题是 - 有没有“更好”的方法来做到这一点?
c++ - 我可以强制 C++ 库使用单线程吗?
我在 linux 上使用专有的 C++ 库,通过 gcc 编译,它使用 pthreads(我必须在 gcc 上使用 -lpthreads 标志)。我有一个包装器,我知道该库正在使用多个线程。
该库动态使用多个线程 - 当我调用它时,我可以看到 20 到 1 个线程之间的任何地方。但我不想使用任务集。(我有其他进程正在运行,我希望系统管理核心)。
有没有办法强制我的可执行文件使用单线程?在编译或运行时。谢谢。
编辑:我可以使用任务集运行可执行文件,然后 cat /proc//status 给我:
状态:R(运行) Tgid:1623 Pid:1623 PPid:31002 TracerPid:0 Uid:500 500 500 500 Gid:100 100 100 100 Utrace:0 FDSize:256 组:100 VmPeak:346528 kB VmSize:345956 kB kB VmHWM: 199816 kB VmRSS: 188388 kB VmData: 192120 kB VmStk: 128 kB VmExe: 656 kB VmLib: 12444 kB VmPTE: 432 kB VmSwap: 0 kB Threads: 1 SigQ: 2/62004 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000004 SigCgt: 0000000180000000 CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: ffffffffffffffff Cpus_allowed: 02 Cpus_allowed_list: 1 Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001 Mems_allowed_list:0 自愿性_ctxt_switches:3460 非自愿性_ctxt_switches:24907
因此,显然,它可以运行单线程。
java - 单线程 Socket 定时器被监视
我需要创建一个单线程观察程序来监视套接字连接以查看它们是否打开或以前打开过,如果它是错误的,则输出一条日志行。
在打开套接字连接的类(3个不同的)中,我创建了一个类似于下面示例的计时器,但这将创建多个我不想要的线程:
我在java方面不是很有经验,所以如果有人可以给我一些关于如何开始这方面的指示,我正在徘徊。
提前致谢。
编辑:
这个想法是多个连接将同时进行,并且它们都需要被这个新类监视。因此,第一个连接将创建观察者对象,随后的连接只会添加要监视的新连接)。
c++ - volatile 在 C++ 的单线程应用程序中是否有用?
volatile
就像标题所说的那样 -在单线程编程的上下文中是否有任何有用的情况?我知道它用于确保始终在内存中实际检查变量的值,所以在任何情况下,该值可能会以应用程序/编译器不会注意到的方式发生变化(在 ST 应用程序中)?
我将这个问题与语言无关,因为我不知道它们之间的任何差异会影响这个问题的答案。但如果有的话请告诉我。
编辑:正如向我指出的那样,这个问题与语言无关。然后我将其具体化为 C++(我已经读过 C++ 版本也存在差异,但我希望它们还不足以使这个问题过于宽泛)。
c# - volatile 在 C# 的单线程应用程序中是否有用?
在单线程编程的上下文中是否存在 volatile 有用的情况?我知道它用于确保始终在内存中实际检查变量的值,所以在任何情况下,该值可能会以应用程序/编译器不会注意到的方式发生变化(在 ST 应用程序中)?
java - volatile 在 Java 的单线程应用程序中是否有用?
如标题所示 - 在 Java 中的单线程编程上下文中是否存在 volatile 有用的情况?我知道它用于确保始终在内存中实际检查变量的值,所以在任何情况下,该值可能会以应用程序/编译器不会注意到的方式更改(在单线程应用程序中)?
javascript - 单线程 JavaScript 下的动画
JavaScript 是一种单线程语言,因此它一次执行一个命令。异步编程正在通过Web API(用于事件处理的 DOM、用于 AJAX 调用的 XMLHttpRequest、用于 setTimeout 的 WindowTimers)和由浏览器管理的事件队列来实现。到现在为止还挺好!现在考虑以下非常简单的代码:
有人可以向我解释上述的基本机制吗?由于 .hide() 尚未完成(动画持续 17 秒)并且 JS 引擎正在处理它并且它能够一次执行一个命令,它以哪种方式转到下一行并继续运行剩余代码?
如果您的答案是动画创建了 Promise,那么问题仍然存在:JavaScript 如何同时处理不止一件事(执行动画本身,在出现 Promise 的情况下观察动画队列并继续执行以下代码。 ..)。
此外,我无法解释 jQuery 中的 Promise 是如何工作的,如果他们必须观察其父 Deferred 对象直到它被解决或拒绝 ,这意味着代码执行,同时剩余的代码被执行。在单线程方法中这怎么可能?我理解 AJAX 调用没有问题,因为我知道它们是从 JS 引擎中拿走的......