Лямбда Callback из Pthread?

Задача в том, чтобы передать в поток лямбда функцию для обработки, например, события завершения потока (onload, а может и onprogress).
Делаю это так:

struct Arg {
    void (*func)();
};


void* threadFunction(void *arg) {

      ((Arg*) arg)->func();
}

void Network::open(const char * url, void (*onload)()) {

Arg* arg;
 arg->func = onload; /// сюда передается какая-то лямбда из внешнего метода []() {   };  
    pthread_attr_init(&attr);

    rc = pthread_create(&thread[0], &attr, threadFunction, arg);
    if (rc) {
        Logger::log("ERROR; return code from pthread_create() is %d\n", rc);
        return;
    }

    pthread_attr_destroy(&attr);
}


И не дождавшись завершения потока получаю RUN FINISHED; Segmentation fault; core dumped;, причем это происходит через раз.

Получается, onload удаляется так и не дождавшись выполнения потока, хотя как раз таки необходимо чтобы она сохранялась. Как это решить?
  • Вопрос задан
  • 308 просмотров
Решения вопроса 1
@Skapix
jew on 1/8
1) стоит инициализировать Arg: Arg* arg = new Arg;
Не забудьте удалить его в конце использования ( как понимаю в threadFunction).
2) Используйте std::function<void()> вместо c-style функции, чтобы избежать лишних проблем с удалением лямбды.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SberTech Москва
от 300 000 до 435 000 ₽
MICARE TECHNOLOGY Москва
от 100 000 до 350 000 ₽
Quantum Brains Санкт-Петербург
от 250 000 до 400 000 ₽