在类中,我声明了线程函数。我使用了static关键字,因为没有static关键字,它不能与类一起使用。
但是如果函数的类型是静态的,那么我将无法访问类的成员函数和公共变量
#include <iostream>
#include <pthread.h>
using namespace std;
class Base{
private:
static void * fpga_read(void*); // Thread function
void foo_2();
public:
/* member variables */
void foo(void);
protected:
int b;
};
void Base::foo(void)
{
pthread_t id;
pthread_create(&id, NULL,fpga_read,NULL);
cout << "\nInside base class" << endl;
}
void * Base::fpga_read(void *p)
{
cout << "\nInside thread function " << endl;
// error: invalid use of member ‘Base::b’ in static member function
cout << "Value of B inside thread class" << b;
int b;
}
int main()
{
Base a;
a.foo();
pthread_exit(NULL);
return 0;
}
任何人都告诉我如何在不使用static关键字的情况下使用线程函数。这样我就可以访问所有类变量。
答案 0 :(得分:0)
pthread_create,就像所有特定于操作系统的线程创建API(Windows中的CreateThread等)一样,具有“ void *”参数可以传递给线程函数。
您可以使用它来传递指向您班级的指针
class A
{
void ThreadToUse() {}
static void Thread2(void* p)
{
A* a = (A*)p;
p->ThreadToUse();
}
void foo()
{
pthread_create(&A::Thread2,(void*)this);
}
};
也就是说,您也可以通过标准方式使用具有相同功能的C ++ 11 std::thread:
void foo()
{
std::thread t(&A::Thread2,this);
}
答案 1 :(得分:0)
您不需要任何静态成员函数。您可以使用group_by
的参数参数,而无状态lambda函数会衰减为普通函数指针,以使代码看起来像您实际编写的内容:
Godbolt链接:https://godbolt.org/z/QIGNUX
pthread_create