multithreading - 线程和处理器

标签 multithreading threadpool processors

我目前正在学习多线程,线程,线程池等。我已经读过,线程数不能超过计算机具有的逻辑处理器数(或者至少没有任何优势,因为您的CPU无法处理更多的逻辑处理器)。

那么,如果编写的代码在具有12个逻辑处理器的计算机上创建了数百个线程,那么预期的行为是什么?他们排队吗?他们互相等待吗?还是给你一个错误?如果您有一个进程可以从100个连续运行的线程中受益,但只有12个内核,那么处理此问题的最佳方法是什么?我经常打开任务管理器,以查看数百个进程和数千个线程正在运行。这是如何运作的?

另外,如果我在Windows上运行一个程序,同时又运行了一堆其他应用程序(例如Chrome,MS Excel,Skype等),也许还有一些后台服务(例如Windows Defender, Wifi服务,等等...)这些其他应用程序是否占用逻辑处理器,从而减少了我的线程程序可用的逻辑处理器数量?

最佳答案

正如Thilo所暗示的那样,现代个人计算机会在任何给定的时间段内永久地创建,执行和销毁数十个(即使不是数百个)线程/进程。在CPU上实际处理的线程数不能超过逻辑核心的数量,但这并不意味着不会有更多的线程在等待执行。

What is the expected behavior if you write code that created hundreds of threads on a computer with say, 12 logical processors?



如果我们假设用于创建这些线程的环境(框架,平台,语言,OS,硬件)可以支持多个并发线程,那么结果将是操作系统根据数量对每个线程进行调度可用核心的数量以及这些线程相对于其他正在运行的线程/进程的优先级。根据特定的操作系统,工具集,程序类型(Windows上的内核模式/用户模式)和运行代码的硬件,此行为可能会发生很大的变化。

附带说明一下,传统线程使用起来可能会很昂贵,因为它迫使处理器执行上下文切换(刷新缓存,加载新上下文,执行)。解决特定问题时,还有其他一些技术可以在某种程度上解决此问题(例如.Net的任务并行性库或C++的并行模式库)。

If you have a process that could benefit from 100 continuously running threads, but only have 12 cores, what is the best way to handle this?



这取决于手头的任务和您所处的环境。异步编程是计算机科学中一个非常重要的主题,因此,存在大量可用的技术和库-每种技术和库都有其优点和缺点。

关于multithreading - 线程和处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36731462/

相关文章:

Android单核线程

.net - 我在理论上了解线程,但在 .net 中不了解实践

java - 具有许多线程的 CyclicBarrier 性能较差 : Would a tree-like synchronization structure be an alternative?

java - 当线程中断时,为什么 ThreadPool 会中断其工作人员?

java - 设置理想的线程池大小

mpi - MPI处理器数量?

java - 多线程怪异行为

java - 以线程安全方式格式化日期抛出 java.text.ParseException :

java - CommonPool 而非自定义池中的 ParallelStream 队列任务

java - 如何识别正确的java执行器?