Запуск метода со ссылочным параметром в отдельном потоке [дубликат]

67
09 декабря 2021, 17:40
На этот вопрос уже даны ответы здесь:
Как передать аргумент в std::thread по ссылке? (1 ответ)
error C2672: "std::invoke": не найдена соответствующая перегруженная функция (1 ответ)
Закрыт 2 года назад.
struct A {
    void f(int& p) {
    }
};
int main() {
    A a;
    int p = 3;
    thread t(&A::f, a, p);
}

Но если убрать ссылочный тип,

struct A {
    void f(int p) {
    }
};

тогда работает

Answer 1

Всегда старайтесь оборачивать таски в std::packaged_task это даст вам фьючу !(https://en.cppreference.com/w/cpp/thread/packaged_task) перед запуском в поток!

Если у Вас референс аргумент - то так и пишите!

Перед стартом потока проверяйте его!

Перед тем как дернуть join проверяйте, а можно ли! А то будет бобо...

И всегда проверяйте как поток отработал!

#include <iostream>
#include <thread>
#include <future>
struct obj
{
    static void f(int& a) {
        ++a;
    }
};

int main() {
    std::thread th1;
    int i{100};
    std::packaged_task<void(int&)> xTask{obj::f};
    auto task{xTask.get_future()};
    std::thread th;

    if (!th1.joinable()) {
       th = std::thread{std::move(xTask), std::ref(i)};
    } else {
       th.join();
       th = std::thread{std::move(xTask), std::ref(i)};
    }
    if (th.joinable()) {
        th.join();
    }
    try {
        task.wait();
        task.get();
    } catch (std::exception& exc) {
            std::cout << exc.what() << std::endl;
    } catch (...) {
        std::cout << "unknown error ~ !"<< std::endl;
    }
    std::cout << "i after task : " << i << std::endl;
    return 0;
}
Answer 2
struct A {
    void f(int& p) {
    }
};
int main() {
    A a;
    int p = 3;
    thread t(&A::f, a, std::ref(p));
}
READ ALSO
Как найти длину гипотезузы?

Как найти длину гипотезузы?

найти значения длины гипотенузы в прямоугольном треугольнике с целыми сторонами, если 1 из катетов (H) Н-простое числоH=(2<=H<=10^4)

147
Не могу понять, почему ругается компилятор

Не могу понять, почему ругается компилятор

Решил попробовать создать двоичный тип данных для вводимых чисел, а также функции конъюнктирования и дизъюнктирования к нимОднако в какой-то...

87
Qt - парсинг запроса на сервере в QTcpSocket

Qt - парсинг запроса на сервере в QTcpSocket

Есть сервер TCP QTcpServer tcp и сокет подключения QTcpSocket socketПодключаю я их вот так:

92