我在 vs2012 中编写了一个正确工作的多线程代码。令我惊讶的是,我分离了近 10000 个线程,并且它可以正常工作。显然,不能同时处理大量线程,因此其中一些被挂起,直到其他线程工作为止。
我想知道 vs2012 中是否存在一些选项来设置允许同时工作的最大线程数。我特别需要这个,以免在线程切换上浪费太多时间。
此外,我想管理允许我的线程使用的内存总量。
提前致谢。
我在 vs2012 中编写了一个正确工作的多线程代码。令我惊讶的是,我分离了近 10000 个线程,并且它可以正常工作。显然,不能同时处理大量线程,因此其中一些被挂起,直到其他线程工作为止。
我想知道 vs2012 中是否存在一些选项来设置允许同时工作的最大线程数。我特别需要这个,以免在线程切换上浪费太多时间。
此外,我想管理允许我的线程使用的内存总量。
提前致谢。
限制生成的线程数是您的工作。
至于他们使用的内存,除了堆栈(我将在下面回到那个)之外,它与您程序的其余部分完全没有区别。实际上,这就是使用线程而不是多个进程的全部意义(fork
用 Unix 的话来说):它们都共享相同的内存。由于操作系统将线程所做的任何分配视为来自您的进程(而不是来自特定线程),因此您不能人为地限制单个线程的内存使用量。
关于分配给每个线程的堆栈内存:您可能想阅读我关于这个主题的这个答案(尤其是第一点),希望您会意识到尝试减少线程的堆栈大小是没有意义的。
所以,总而言之,线程就像程序的任何其他部分一样:你不能对它们的数量或它们允许分配的内存数量施加硬限制(在你的机器可以处理的范围内) , 当然)。同样,正确管理资源是程序员的工作,而不是编译器的工作,也不是操作系统的工作。
您想要少于 10000 个线程?然后不要一开始就产生它们。您希望他们使用更少的内存吗?然后不要首先分配该内存。您所要做的就是在您的代码中加入必要的保护措施。
如果您不想要比硬件线程更多的线程,请仅在最大std::thread::hardware_concurrency
线程处生成。
但是,在某些情况下,如果您的工作有时由于 I/O 或其他原因而阻塞,则可能会出现超额订阅。
关于内存管理,这是 C++,您几乎可以完全控制使用多少内存以及何时释放它。线程将仅使用您在其上运行的函数所需的内存(除了一些内部开销)。
众所周知,在任何单个调度程序时间片内可以运行的最大线程数与机器中的内核数相同。因此,如果所有 10,000 个线程都准备好运行(没有在信号量或 I/O 等上阻塞),那么任何时候实际上只有极少数线程会运行。
如果你想减少这个数字,你可能会利用核心亲和性来限制允许线程运行的核心集。
要增加这个数字,您当然需要更多的 CPU 内核。万线程是大型机的领地...
限制使用的内核是一种程序可以在一台还有其他事情要做的机器上“很好地运行”的方式。AFAIK C++11 没有核心关联方法,但允许您获取底层本机线程句柄。然后,您可以在调用本机核心关联函数时使用它。