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

时间:2017-08-16 20:11:04

标签: 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_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

由于

2 个答案:

答案 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完成。 时间:

  • t执行foo
  • foo永远不会结束,因为真的是

然后:你从不在加入

之后执行指令

所以你有不间断的111111