为什么此函数不能正确打印坐标



正如我在标题中所说,我在使用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函数可能在线程结束之前结束,这意味着Oven的生命周期结束,对它的任何引用或指针都将无效。

如果不分离线程(而是join(,那么它应该可以正常工作。

另一种解决方案是使用std::array,在这种情况下,线程将拥有自己的数组对象副本。


附带说明一下,这里不需要std::ref,因为dostuff函数需要一个指针,而不是引用。这就是普通Oven将衰变为的。

普通

std::thread thread_obj(dostuff,Oven);

会完全一样地工作,甚至有同样的问题。

因为main先于线程退出。更改此项:

thread_obj.detach();

成为这样:

thread_obj.join();

最新更新