是否可以选择从程序内部运行的线程数?c++

Is it possible to select the number of threads to run from inside a program? c++

本文关键字:线程 c++ 运行 内部 选择 程序 是否      更新时间:2023-10-16

我想做一个程序,在那里你可以选择要执行的线程数量,我有问题,让它工作。我尝试先创建线程,然后根据所选的数量加入所有线程,但是当我尝试加入线程时,程序没有检测到线程。

//####################### CREATE THREADS ###################
if (numProcs >= 1)
{
    thread t1(threadTask,repart[0],llargMax,contrassenya);
}
if (numProcs >= 2)
{
    thread t2(threadTask,repart[1],llargMax,contrassenya);
}
if (numProcs >= 3)
{
    thread t3(threadTask,repart[2],llargMax,contrassenya);
}
if (numProcs >= 4)
{
    thread t4(threadTask,repart[4],llargMax,contrassenya);
}
//################## JOIN THREADS ################################
if (numProcs >= 1)
{
    t1.join();
}
if (numProcs >= 2)
{
    t2.join();
}
if (numProcs >= 3)
{
    t3.join();
}
if (numProcs >= 4)
{
    t4.join();
}

我也试过在创建线程后加入每个线程,但这会停止我的程序,一次只加入一个线程。

if (numProcs >= 1)
{
    thread t1(threadTask,repart[0],llargMax,contrassenya);
    t1.join();
}
if (numProcs >= 2)
{
    thread t2(threadTask,repart[1],llargMax,contrassenya);
    t2.join();
}
if (numProcs >= 3)
{
    thread t3(threadTask,repart[2],llargMax,contrassenya);
    t3.join();
}
if (numProcs >= 4)
{
    thread t4(threadTask,repart[4],llargMax,contrassenya);
    t4.join();
}

最后我试着分离线程,如果在我的主程序结束时,我等待了一段相当长的时间,这样每个线程都可以在退出程序之前完成,但是我不知道如何检测所有分离的线程何时结束,所以我的程序可以使用更大的线程。

if (numProcs >= 1)
{
    thread t1(threadTask,repart[0],llargMax,contrassenya);
    t1.detach()
}
if (numProcs >= 2)
{
    thread t2(threadTask,repart[1],llargMax,contrassenya);
    t2.detach();
}
if (numProcs >= 3)
{
    thread t3(threadTask,repart[2],llargMax,contrassenya);
    t3.detach();
}
if (numProcs >= 4)
{
    thread t4(threadTask,repart[4],llargMax,contrassenya);
    t4.detach();
}
sleep(100)
这些方法我都试过了,但是现在我卡住了,我不知道我能试什么。任何关于如何做到这一点的想法都会对我有很大帮助。

使用容器,如vector。应该是这样的:

#include <thread>
#include <vector>
int main(int argc, char* argv[]) {
  size_t num_threads = 123;
  std::vector<std::thread> vect_threads(num_threads);
  for (auto& th : vect_threads) {
    th = std::thread ( /*...*/ );
  }
  // main branch ... stuff...      
  for (auto& th : vect_threads) {
    if (th.joinable()) {
      th.join();
    }
  }
  return 0;
}

这不起作用,因为{...}块定义了一个单独的作用域,因此t1, ...变量不存在于它们之外。

使用其他容器代替,例如

std::vector<std::thread> threads;
for (int i = 0; i < numProcs; i++) {
    auto t = std::thread(threadTask, repart[i], llargMax, contrassenya);
    threads.push_back(std::move(t));
}
// later
for (auto& t : threads) {
    t.join();
}

我尝试先创建线程,然后根据所选的数量加入所有线程,但是当我尝试加入它们时,程序没有检测到线程。

您将所有std::thread对象创建为局部变量。if阻滞后,它们消失

将它们存储在容器中

我也试过在创建线程后加入每个线程,但这会停止我的程序,一次只加入一个线程。

这有什么意义?你只是按顺序运行线程入口点。

我不知道如何检测当所有分离线程已经结束

你不能。他们分离。