hakain
@hakain
Немного знаю С/С++, Qt, и микроконтроллеры

Как правильно работать с callback функциями в многопоточных программах?

Суть вопроса:

Есть библиотека. При создании объекта класса этой библиотеки регистрируем callback и при запуске эта библиотека создает поток, в котором он встает в блокирующее чтение чего либо, при каком то событии он вызывает наш callback. Callback должен быть либо глобальным, либо членом класса но статическим (на самом деле без разницы). Что делать, в случае, если мне нужно в теле callback изменить значение переменной val при условии, что эту переменную я не могу сделать статической?

#include "LibClass"

int my_callback(int args...) { 
    // к примеру как здесь адекватно присвоить переменной val значение
}

MyClass {
    int val;
    LibClass libclass;

public:
    MyClass() {
        libclass.register_callback(my_callback);
        libclass.run();
    }

    // ... etc 
};


UPD:
Я забыл уточнить то, что я не могу залезть в LibClass и менять реализацию, соответственно callback я тоже не могу изменить, аргументы у него всегда будут теми же
  • Вопрос задан
  • 725 просмотров
Решения вопроса 1
@OYTIS
Embedded Software Developer
Обычно колбэку в таких случаях передается this в качестве параметра (большинство библиотек поддерживают передачу void* параметра колбэкам). Переменную val нужно или объявить публичной, или сделать геттеры/сеттеры или объявить my_callback как friend для MyClass. Переменную нужно защитить так же, как для обычной многопоточной программы. На вскидку здесь могут подойти std::atomic или std::mutex.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы