为什么这个函数不能正确打印坐标?

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);

会完全一样,甚至会遇到同样的问题。