我想制作一个程序,从数据库中获取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;
}
输出是:
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
由于
答案 0 :(得分:0)
有问题的for
循环当前创建了一个thread
对象和一个线程。期。 join
通过强制主线程等待线程运行完成来隐藏此问题。线程不能是另一个问题。
创建一个线程并立即join
强制您的程序按顺序运行并且无法使用线程。未加入thread
将导致错误,因为thread
对象将在循环结束时被销毁,thread
尚未分离。 Destroying an undetached thread is bad. std::terminate
几乎听起来像是这样:它杀死了Sarah Connor并杀死了他。开玩笑。它以一个刽子手的斧头的所有微妙结束你的程序。
你可以通过调用detach
来手动分离线程,但这是一个非常非常糟糕的想法,因为你失去了对线程的控制,你的程序将在线程仍在运行时退出。
您需要在产生这些线程的循环之后存储这些线程和join
。
这是一个简单的方法:
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
个线程,我相信你可以自己解决这个问题。
答案 1 :(得分:0)
t.join();
意味着程序在这里等待线程t完成。
时间:
然后:你从不在加入
之后执行指令所以你有不间断的111111