我尝试运行一个启动线程的函数,但我收到了错误:
error: invalid use of non-static member function ‘void Sniffer::f1(int)’
代码:
#include "library.hpp"
class Sniffer
{
void f1( int x );
void f2();
};
void Sniffer::f1( int x )
{
while (true)
{
sleep(x);
std::cout << 1 << std::endl;
}
}
void Sniffer::f2()
{
int y = 5;
std::thread t1( f1, y );
t1.join();
}
int main()
{
return 0;
}
任何其他方式,在静态函数上修改它而不更改函数?
答案 0 :(得分:4)
在C ++中,成员函数有一个隐含的第一个参数,它绑定到this
。创建线程时,必须传递this
指针。您还必须使用类名限定成员函数。您案例中正确的线程构造函数如下所示:
std::thread t1( &Sniffer::f1, this, y );
或者,您可以将lambda传递给线程构造函数:
std::thread t1([this, y] // capture the this pointer and y by value
{
this->f1(y);
});
答案 1 :(得分:2)
创建std::thread
时,它不会为您捕获this
指针。在创建线程时,您必须包含this
指针,或者您可以使用捕获this
的lambda或通过引用捕获所有内容。
e.g:
void Sniffer::f2()
{
int y = 5;
std::thread t1(&Sniffer::f1, this, y);
t1.join();
}
或:
void Sniffer::f2()
{
int y = 5;
std::thread t1([&,y](){f1(y); }); // captures everything (including this) by reference, captures a copy of y
// becuase y coud go out of scope and be destroyed while the thread could
// continue running (even though in this case that won't happen because the join is in the same scope
t1.join();
}
当然,如果您捕获this
,那么您不需要在lambda的主体中提及它并且不需要参数我们可以删除()
,这简化为:
void Sniffer::f2()
{
int y = 5;
std::thread t1([this,y]{f1(y); });
t1.join();
}