首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当创建线程时,它们是并行运行还是并发运行?

当创建线程时,它们是并行运行还是并发运行?
EN

Stack Overflow用户
提问于 2022-04-23 04:19:38
回答 2查看 539关注 0票数 0

我正在学习多线程,我理解并行性和并发性之间的区别。我的问题是,如果我创建第二个线程并将其与父线程分离,这两个线程是并发运行还是并行运行?

EN

回答 2

Stack Overflow用户

发布于 2022-04-23 04:55:17

通常(对于一个现代操作系统),大约有100个进程,每个进程平均有2个线程,总共有200个线程,仅用于后台服务、GUI、软件更新程序等。您启动进程(多一个线程),它就会产生第二个线程,所以现在有202个线程。

在这202个线程中,几乎所有线程都会被阻塞,等待大多数情况发生。如果30个线程没有被阻塞,并且您有8个CPU,那么30个线程就会争夺这8个CPU。

如果30个线程争夺8个CPU,那么可能有4个线程是高优先级的,为自己获得了一个完整的CPU,10个线程是低优先级的,没有CPU时间,因为CPU有更重要的工作要做;也许有12个线程具有中等优先级,并且通过时分复用(经常在线程之间切换)共享4个CPU。它的实际工作方式取决于操作系统及其调度器(它对于不同的操作系统非常不同)。

当然,线程数量及其优先级经常发生变化(例如,线程被创建和终止),线程阻塞和取消阻塞非常频繁,所以有多少线程在竞争CPU(而不是阻塞)是不断变化的。也许有30个线程在同一时间点竞争8个CPU,2毫秒后有5个线程和3个CPU处于空闲状态。

我的问题是,如果我创建第二个线程并将它从父线程中分离出来,那么这两个线程是并发运行还是并行运行?

是的;您的两个线程可以并发运行(共享一个CPU和时分复用),也可以并行运行(在不同的CPU上);并且可以在不同的时间同时运行(同时运行一段时间,然后并行一段时间,然后.)。

票数 2
EN

Stack Overflow用户

发布于 2022-04-23 12:44:35

如果我创建第二个线程并拆开它.

分离不是你的程序可以做的线程。这仅仅是程序可以对std::thread对象所做的事情。对象不是线程。对象只是一个句柄,您的程序可以用来讨论线程,而“分离”只是授予程序销毁句柄的权限,而线程继续运行。

...from父线程

因此," detach“不会将一个线程从另一个线程(例如,”子线程“与其”父线程")分离,而是将一个线程从它的std::thread句柄中分离出来。

FYI:大多数编程环境不识别线程之间的任何父/子关系。如果线程A创建线程B,则线程A没有线程C、D和E所没有的线程B的任何特权或功能。

这并不是说你认不出这段关系。它可能在你的节目中有意义。这对操作系统没有任何意义。

...Parallel或并发

这既不是-也不是选择。并行是并行的。

“并发”并不意味着“线程上下文切换”。相反,它是关于线程访问和更新共享变量的顺序的语句。

当两个线程在典型的多进程硬件上并发运行时,它们的操作将是可序列化的。这意味着程序的结果将是相同的,就像某个单一的、虚构的线程所做的一切与真正的程序线程所做的一样,并且它以某种特定的顺序一个接一个地执行它们。

如果序列化是不确定的,则两个线程是并发的。也就是说,如果事情发生的“特殊顺序”不是完全由程序决定的话。如果程序的不同运行可以表现为假想的单线程选择不同的序列化,则它们是并发的。

还有一个更简单的测试,这通常相当于相同的事情:如果两个线程都是在两个线程完成之前启动的,那么两个线程可能是并发的。

无论如何,如果两个线程真正是并行运行的,那么它们也必须是并发的。

--它们会并行运行吗?

@Brendan已经回答了这个问题。TLDR:如果计算机有多个CPU,那么它们可能可以并行运行。但是,他们实际并行运行的时间有多少取决于许多事情,而且其中许多事情都在操作系统领域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71976783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档