是否可以从程序中选择要运行的线程数? C ++

时间:2016-08-19 10:39:27

标签: c++ multithreading

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

//####################### 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)

我已尝试过所有这些方法,但现在我陷入了困境,我不知道自己能尝试什么。关于如何做到这一点的任何想法将帮助我很多。

3 个答案:

答案 0 :(得分:2)

使用容器,如 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;
}

答案 1 :(得分:0)

  

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

您创建了所有std::thread个对象作为局部变量。 if阻止后,他们

将它们存储在容器中。

  

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

其中的重点是什么?您只是按顺序运行线程入口点。

  

我不知道如何检测所有分离的线程何时结束

你不能。他们分离了。

答案 2 :(得分: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();
}