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