我想做一个程序,你可以选择要执行的线程数,并且我有问题让它工作。我试图首先创建线程,然后根据所选的数字加入所有线程,但是当我尝试加入它们时程序没有检测到线程。
//####################### 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)
我已尝试过所有这些方法,但现在我陷入了困境,我不知道自己能尝试什么。关于如何做到这一点的任何想法将帮助我很多。
答案 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();
}