不带类的静态声明的pthread

时间:2019-05-30 10:35:03

标签: c++ linux multithreading pthreads

在类中,我声明了线程函数。我使用了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关键字的情况下使用线程函数。这样我就可以访问所有类变量。

2 个答案:

答案 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