【发布时间】:2021-05-30 16:20:38
【问题描述】:
我试图了解std::thread 是如何使用的。
标题如下:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
- 如何识别
f是通用引用还是右值?根据我在网上找到的:
“如果推导 T 并且变量/参数类型是不合格的 T&& ,那么只有它是通用引用。”
unqualified T&& 指的是什么? auto 或 template?
-
如果我有一个函数
foo,我可以像std::thread(foo)一样调用它。这是否意味着foo被用作左值引用,因为它不符合右值引用的条件? -
为什么传递函数的方式与成员函数不同?如果
foo是课程的一部分,您将无法像std::thread(obj.foo)那样使用它 - 而是std::thread(&Class::foo, &obj)有效。其背后的逻辑推理是什么? -
如何将局部变量/向量传递给线程?我尝试了以下方法,但在函数本身中,即使
vector.size()确实输出正确,我也无法访问任何矢量元素。
void Class::foo(vector<int>v)
{
std::cout<<v[0]; // prints nothing
}
int main(void)
{
std::vector<int>v = {12,3};
Class obj;
std::thread t1(&Class::foo, &obj, v);
t1.join();
}
【问题讨论】:
-
您需要展示整个程序。如果它太大,请制作一个较小的版本以显示。如果我不得不打赌,你正在退出你的函数并破坏你的局部变量,然后在你的线程中使用他们死去的僵尸尸体。不要那样做。
-
另外,成员函数指针也不同,因为它们总是两个指针。一个指向函数的指针和一个指向用来调用该函数的对象的指针。
标签: c++ multithreading stl stdthread