我读到可以在没有并发的情况下实现并行性。它是否正确?
假设您有两个任务 A 和 B,并且每个任务需要两个步骤才能完成:A1、A2、B1、B2。另外,进程是由线程组成的。
以下是我对并发和并行的看法:
顺序
Time ----->
Thread 1: A1 A2 B1 B2
Run Code Online (Sandbox Code Playgroud)
同时
Time ----->
Thread 1: A1 A2
Thread 2: B1 B2
Run Code Online (Sandbox Code Playgroud)
并行(和并发)
Time ----->
Thread 1: A1 A2
Thread 2: B1 B2
Run Code Online (Sandbox Code Playgroud)
如果这是正确的,那么没有并发性就不可能有并行性。
此外,如果此模型正确,您可能会得到以下结果:
顺序(和并发)
Time ----->
Thread 1: A1 B1
Thread 2: A2 B2
Run Code Online (Sandbox Code Playgroud)
这可能不是一个好主意,但在概念上似乎是可能的。
parallel-processing concurrency multithreading process single-threaded
单线程应用程序可以出现死锁吗?如果是,请提供一个例子.
我是nodejs的新手,目前正在学习它.我知道nodejs是单线程的,但是我想知道:如果我使用非阻塞方法,例如,有20000个并发请求,并且有一个请求需要花费很长时间,其他线程需要更短的时间.所以一旦我们遇到了更长的时间请求,nodejs会说"嗨,请暂停,其他请求需要使用",nodejs是否有一个默认时间来检测是否需要暂停?纠正我,如果我使用错误的单词"puase"(因为我认为因为它是单线程,所以它应该停止计算一个请求,如果另一个请求想要处理.).在我假设的情况下,那么较长的请求需要大量时间才能处理?
谢谢你的帮助.
我在 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:345 956 kB VmLck:0 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 线程:1 SigQ:2/62004 SigPnd:00 00000000000000 ShdPnd:0000000000000000 SigBlk:0000000000000000 SigIgn:0000000000000004 SigCgt:0000000180000000 CapInh:0000000000000000 CapPrm:0000000000000000 CapEff:0000000000000000 CapBnd:ffffffffffffffff CPU _allowed: 02 CPU_allowed_list: …
我刚刚学习了Java中并行处理的基础知识.我读到了这个问题:单个CPU上有多个线程和性能,并且想知道在单核系统上多线程可能比单线程更快的原因还有其他原因.我在考虑每个线程如何拥有它自己使用的内存.想象一下,在Java中,FXML是主线程的一部分.这可能会增加主线程内存的大小,反过来这可能会减慢线程,因为它必须在交换上加载更多的值,或者更糟糕的是,必须对内存进行更多调用(我认为当前线程的值被复制到缓存中).
总结一下,由于内存分离,可以在单核系统上创建多个线程吗?
我想知道当只有一个线程时使用互斥体或信号量是否有意义?
感谢您的帮助。
我目前正在尝试了解Redis的一些基本实现。我知道 redis 是单线程的,我已经偶然发现了以下问题:Redis 是单线程的,那么它如何进行并发 I/O?
但我仍然认为我没有理解它。Afaik Redis 使用一个单线程的反应器模式。因此,如果我理解正确,那么有一个观察者(处理 FD/传入/传出连接)将要完成的工作委托给它注册的事件处理程序。他们做实际的工作并设置例如。他们的响应作为事件给观察者,观察者将响应传输回客户端。但是如果客户端的请求 (R1) 花费大约 1 分钟会发生什么。另一个客户端创建另一个(快速)请求 (R2)。然后 - 由于 redis 是单线程的 - 在 R1 完成之前,不能将 R2 委托给正确的处理程序,对吗?在多线程环境中,您可以在单个线程中启动每个处理程序,因此“主”
如果它真的只是将 io 处理和处理程序逻辑排队,那么它永远不会那么快。我在这里缺少什么?
我一直认为 JS 是一种单线程语言,这使得它对于 CPU 密集型任务效率低下。我最近遇到了工作线程以及它如何通过创建“一个进程下的多个工作线程”来解决这个低效率问题。进程和线程有什么区别?为什么 JS 突然能够产生多个工作线程来帮助主 JS 线程并与之交互以实现并发?你能帮我通俗地理解这个话题吗?谢谢
javascript multithreading single-threaded worker-thread node.js
在Java中,我需要获取两个参数,Runnable和Delay,单位是毫秒,并且需要在延迟时间内运行Runnable。这需要在单线程中运行,如果使用不同的参数值调用该方法并且前一个任务尚未完成,则应将其保留在队列中。
public void runScheduledTask(Runnable task, long delay) {
// ...
}
...
runScheduledTask(task1, 10); // at 00:00:00.000
runScheduledTask(task2, 10); // at 00:00:00.005
Run Code Online (Sandbox Code Playgroud)
当用task2调用该方法时,task1尚未开始/完成,因为有延迟10,因此task2应该存储在队列中。在这种情况下,有没有办法检查任务 1 是否已完成?由于这应该在当前线程中运行,所以我不知道可以使用哪些类或工具。
我正在努力了解Redis的基础知识.一直到处都是,Redis是单线程的,它使事情成为原子.但是我无法想象它是如何在内部工作的.我有一点疑问.
我们不设计服务器单线程,如果它是IO绑定应用程序(如Node.js),其中线程在启动IO操作后获得另一个请求,并在IO操作完成后将数据返回给客户端(提供并发).但是在redis的情况下,所有数据都可以在主内存中找到,我们根本不打算进行IO操作.那么为什么Redis是单线程的?如果第一个请求需要花费很多时间会发生什么,剩下的请求将不得不保留等候?
single-threaded ×10
java ×2
node.js ×2
redis ×2
c++ ×1
concurrency ×1
deadlock ×1
event-driven ×1
gcc ×1
javascript ×1
mutex ×1
performance ×1
process ×1
pthreads ×1
reactor ×1
runnable ×1
semaphore ×1