为什么这个函数不能正确打印坐标?
Why does this function not print the coordinates properly?
正如我在标题中所说,我在使用 std::thread
尝试打印这样的坐标值时遇到问题
#include <array>
#include <thread>
struct Vec2
{
int x;
int y;
};
void dostuff2(Vec2 x)
{
std::cout << x.x << x.y << " ";
}
void dostuff(Vec2 Oven[3])
{
for (int i=0; i<3; ++i)
{
dostuff2(Oven[i]);
}
}
int main()
{
Vec2 Oven[3]{ {63,21},{63,22},{63,23} };
std::thread thread_obj(dostuff,std::ref(Oven));
thread_obj.detach();
}
知道为什么这段代码不起作用吗?它在没有我在单独的线程上执行函数的情况下工作..
因为 main 在线程退出之前退出。
改变这个:
thread_obj.detach();
变成这样:
thread_obj.join();
main
函数可能会在线程结束之前结束,这意味着 Oven
的生命周期结束并且指向它的任何引用或指针都将失效。
如果您不分离线程(而是 join
它)那么它应该可以正常工作。
另一种解决方案是使用 std::array
,在这种情况下,线程将拥有自己的数组对象副本。
附带说明一下,这里不需要 std::ref
,因为 dostuff
函数需要指针,而不是引用。这就是普通 Oven
会衰变的样子。
普通
std::thread thread_obj(dostuff,Oven);
会完全一样,甚至会遇到同样的问题。
正如我在标题中所说,我在使用 std::thread
尝试打印这样的坐标值时遇到问题#include <array>
#include <thread>
struct Vec2
{
int x;
int y;
};
void dostuff2(Vec2 x)
{
std::cout << x.x << x.y << " ";
}
void dostuff(Vec2 Oven[3])
{
for (int i=0; i<3; ++i)
{
dostuff2(Oven[i]);
}
}
int main()
{
Vec2 Oven[3]{ {63,21},{63,22},{63,23} };
std::thread thread_obj(dostuff,std::ref(Oven));
thread_obj.detach();
}
知道为什么这段代码不起作用吗?它在没有我在单独的线程上执行函数的情况下工作..
因为 main 在线程退出之前退出。 改变这个:
thread_obj.detach();
变成这样:
thread_obj.join();
main
函数可能会在线程结束之前结束,这意味着 Oven
的生命周期结束并且指向它的任何引用或指针都将失效。
如果您不分离线程(而是 join
它)那么它应该可以正常工作。
另一种解决方案是使用 std::array
,在这种情况下,线程将拥有自己的数组对象副本。
附带说明一下,这里不需要 std::ref
,因为 dostuff
函数需要指针,而不是引用。这就是普通 Oven
会衰变的样子。
普通
std::thread thread_obj(dostuff,Oven);
会完全一样,甚至会遇到同样的问题。