C++ for循环中的线程无法正常工作

C++ for循环中的线程无法正常工作,c++,multithreading,while-loop,C++,Multithreading,While Loop,我想制作一个程序,从数据库中获取id,并为每个id创建一个具有相同函数的线程。它可以工作,但当我向函数添加一个while循环时,它只挂在那里,不获取下一个id 我的代码是: void foo(char* i) { while(1){ std::cout << i; } } void makeThreads() { int i; MYSQL *sqlhnd = mysql_init(NULL); mysql_real_conn

我想制作一个程序,从数据库中获取id,并为每个id创建一个具有相同函数的线程。它可以工作,但当我向函数添加一个while循环时,它只挂在那里,不获取下一个id

我的代码是:

void foo(char* i) {
    while(1){
        std::cout << i;
    }
}

void makeThreads()
{
    int i;

    MYSQL *sqlhnd = mysql_init(NULL);
    mysql_real_connect(sqlhnd, "127.0.0.1", "root", "h0flcepqE", "Blazor", 3306, NULL, 0);

    mysql_query(sqlhnd, "SELECT id FROM `notifications`");
    MYSQL_RES *confres = mysql_store_result(sqlhnd);
    int totalrows = mysql_num_rows(confres);
    int numfields = mysql_num_fields(confres);
    MYSQL_FIELD *mfield;
    MYSQL_ROW row;

    while((row = mysql_fetch_row(confres)))
    {
        for(i = 0; i < numfields; i++)
        {

            printf("%s", row[i]);

            std::thread t(foo, row[i]);


            t.join();


        }
    }

}

int main()
{
    makeThreads();
    return 0;
}
输出为:

11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

感谢您,所讨论的for循环当前创建了一个线程对象和一个线程。时期通过强制主线程等待线程运行完成,连接在某种程度上隐藏了这个问题。线程不能执行是另一个问题

创建一个线程并立即连接会强制程序按顺序运行,从而破坏了使用线程的意义。不加入线程将导致错误,因为线程对象将在循环结束时被销毁,并且线程尚未分离。terminate的作用和它听起来的差不多:它追捕并杀死Sarah Connor。只是开玩笑。它以一把头人斧头的微妙动作结束了你的节目

您可以通过调用detach手动分离线程,但这是一个非常非常糟糕的主意,因为您失去了对线程的控制,并且程序将在线程仍在运行时退出

您需要存储这些线程,并在生成它们的循环之后加入它们

下面是一个简单的方法:

std::vector<std::thread> threads;
for(i = 0; i < numfields; i++)
{
    std::cout << row[i];
    threads.push_back(std::thread(foo, row[i]));
}
for (std::thread & t: threads)
{
    t.join();
}
现在,您将永远运行numfields线程,我相信您可以自己解决这个问题。

t.join; 表示程序在此等待线程t完成。 自:

特福 福永远不会结束,因为它是真实的 然后:您永远不会在联接之后执行指令


因此,您有一个不间断的111111

线程将永远不会加入,因为它的执行永远不会结束。问题就在这里。你知道线程上的join调用是什么吗,例如在t.join;?它挂起块线程,并等待连接的线程t终止。而且,正如所写的,它从来没有这样做过。如果您阅读了调试器的文档,或者在调试器中逐步完成了代码,那么这样的功能是显而易见的{std::cout As@Stephan说:这是对CPU的残忍!你应该为此被罚款。对,因为线程没有终止,所以代码不会被执行。有没有办法创建一个新线程并将其加入到for循环中?