Pthread без статического замедления с классом - PullRequest
0 голосов
/ 30 мая 2019

Внутри класса я объявил функцию потока. Я использовал статическое ключевое слово, потому что без статического ключевого слова оно не работает с классом.

Но если тип функции статический, я не смог бы получить доступ к функции-члену и открытым переменным класса

#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;
}

Любое тело подскажите, как использовать функцию потока без статического ключевого слова. так что я могу получить доступ ко всем переменным класса.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Вам не нужна статическая функция-член. Вы можете использовать параметр аргумента pthread_create, и лямбда-функции без сохранения состояния преобразуются в обычные указатели на функции, чтобы создать код, который выглядит почти так, как вы написали:

Годболт ссылка: https://godbolt.org/z/QIGNUX


#include <iostream>
#include <pthread.h>

class Base {
public:
    Base(int state) noexcept : b{state} {}

    void foo();

private:
    int b;

    void fpga_read() {
        std::cout << "Value of B inside thread class" << b;
    }
};

void Base::foo()
{
    pthread_t thread;
    pthread_create(&thread, nullptr, [](void* that) -> void* {
        Base* this_ = static_cast<Base*>(that);
        this_->fpga_read();
        return nullptr;
    }, static_cast<void*>(this));
    pthread_join(thread, nullptr);
}
0 голосов
/ 30 мая 2019

pthread_create , как и все специфичные для ОС API создания потоков (CreateThread и т. Д. В Windows), имеет параметр "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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...