C++ for循环中的线程无法正常工作
我想制作一个程序,从数据库中获取id,并为每个id创建一个具有相同函数的线程。它可以工作,但当我向函数添加一个while循环时,它只挂在那里,不获取下一个id 我的代码是: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
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循环中?