【发布时间】:2017-08-16 20:11:04
【问题描述】:
我想制作一个程序,从数据库中获取 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;
}
输出是:
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
谢谢
【问题讨论】:
-
线程永远不会加入,因为它的执行永远不会结束。问题出在 imo 上。
-
您知道线程上的
join调用什么(例如在t.join();中)吗?它挂起阻塞线程,并等待joined 线程(t)终止。而且,正如所写,它永远不会。如果您阅读std::thread::join的文档,或者在调试器中单步调试您的代码,这样的功能就会很明显。 -
除了挂起之外,您对循环
while(1){ std::cout << i; }的期望是什么,或者您期望的输出是什么? -
正如@Stephan 所说:这对 CPU 来说太残忍了!你应该为此被罚款。
-
对,所以代码不会被执行,因为线程没有被终止。有什么方法可以创建一个新线程并将其加入 for- 循环?
标签: c++ multithreading while-loop