gpt4 book ai didi

c++ - 显示 std::thread 函数传递的错误数据。

转载 作者:行者123 更新时间:2023-11-27 22:39:28 24 4
gpt4 key购买 nike

我正在使用 C++ 线程。我想显示从 SQL 数据库传递到 Thread 函数的每一行并显示它。我的问题是,如果我将显示的数据传递给每个 Thread 数组,则显示的数据有些多余。为什么我显示错误的数据?

void callThread(char fname[], int age, int i) {
std::cout << "\tThread : " << std::this_thread::get_id() << std::endl;
std::cout << fname << age << std::endl;
}


/*Inside main function*/
int i = 0;
int age;
char fname[20];

while (SQLFetch(sqlStmtHandle) == SQL_SUCCESS) {
SQLGetData(sqlStmtHandle, 1, SQL_CHAR, fname, sizeof(fname), NULL);
SQLGetData(sqlStmtHandle, 2, SQL_C_ULONG, &age, sizeof(age), NULL);

//display query result
//std::cout << "\nQuery Result:\n\n";
//std::cout << fname << age << std::endl;

threadArray[i] = std::thread(callThread, fname, age, i);
threadArray[i].detach();

i++;
printf("\n Counter: %d\n",i);
}

数据库内容:
enter image description here

示例输出:
卡特里娜飓风 23
卡特里娜飓风 22

期望的输出
詹姆斯 23
卡特里娜飓风 22

最佳答案

您有一个竞争条件:fname 是一个数组,您将名字读入其中。当您将它传递给线程时,您真正传递的只是一个指向内存中第一个元素的指针。读取下一个值,覆盖该数组中的名称 - 另一个线程仍然使用相同的内存位置。

解决方案是在将字符串传递给另一个线程之前复制该字符串,最好通过 std::string:

void callThread(std::string fname, int age, int i) {
std::cout << "\tThread : " << std::this_thread::get_id() << std::endl;
std::cout << fname << age << std::endl;
}

// ...

threadArray[i] = std::thread(callThread, std::string(fname), age, i);

关于c++ - 显示 std::thread 函数传递的错误数据。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50317363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com