正如我在标题中所说,我在使用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();