在这个论坛上研究我的问题时,我发现了一个关于boost :: thread之前问过很多次的基本问题,但没有一个答案似乎能满足我的特定需求。从我正在思考它的方式来看问题的重点是如何实例化一些线程而不实际启动任何线程,直到你准备好。答案似乎总是存在,为什么不等到你准备好在实例化它之前启动每个线程。实际上,在我看来,boost :: thread的设计方式就是这样。也就是说,似乎实例化一个boost :: thread对象似乎也想要启动该线程,而且我不清楚这些函数是否真的可以分开。
我会尝试解释一下我的申请,而不是其他一些提问者解释过的。我需要启动至少几十个,如果不是数百甚至数千个线程。每个线程将运行完全相同的函数,并且线程将通过作为每个线程的一部分传递给函数的单个且唯一的参数彼此区分。每个线程将使用大量共享内存,这些内存将是只读的,不需要同步。每个线程还将使用大量本地内存,这些内存将动态分配,并在线程完成之前释放。本地内存也不需要同步。实际上,我想我可能无需在线程之间进行任何同步,除了连接以等待每个线程的完成。
该程序将运行数十甚至数百甚至数千小时,因此我想使用我机器上的所有处理器核心,但我不想同时启动更多线程而不是处理器数量我有的核心。问题是,如果我要同时启动太多线程,由于每个线程使用本地内存,它们很快就会耗尽机器的内存。但是如果我能够设法启动与我有处理器内核一样多的线程,那么内存情况就可以了。
因此,如果我有n个核心,我想启动n个线程并等待其中一个完成。当其中一个完成后,我想再发一个,等等,直到完成所有工作。我看过thread_group和join_all。在thread_group本身,我无法弄清楚如何在实例化(n + 1)st之前等待前n个线程中的一个完成,等等。而join_all不是我真正需要的,因为我只想等待直到少于n个线程仍在运行,并且首先完成哪个线程无关紧要。每当活动线程数小于n时,我想启动一个新线程。我很确定add_thread()会以某种方式或其他方式参与其中。我也很确定boost :: thread size()函数将以某种方式或其他方式涉及。但我真的不知道如何将所有部分组合在一起。并且这个问题似乎总是归结为只有在我准备好时才能理解如何实例化一个线程。例如,我能够找到的所有boost :: thread示例似乎都有“静态命名”的线程对象,即“boost :: thread MyWorkerFunction”等,它们在代码中遇到实例化。好吧,我可以为同一个MyWorkerFunction创建数千个线程,我只想同时调度n个线程,我不明白该怎么做。
谢谢, 杰里