LINUX.ORG.RU

Вызвать метод класса в потоке, С++

 , ,


0

3

Добрый день! Изучаю ООП С++, попутно переписываю старые программы в стиле ООП, наткнулся на проблему. Есть объект Х класса Test, в классе есть два метода, допустим метод А и метод Б, метод А крутится в цикле и ожидает определенного события, когда событие происходит метод А должен вызвать метод Б в параллельном потоке (thread t1) и открепить (t1.detach()) его, в свою очередь метод Б должен иметь возможность продолжать работать с объектом Х. Подскажите как это правильно реализовать? Для запуска обычной функции в потоке, все было просто

thread t1(Function, Param1, Param2);
t1.detach();
С методами, понятное дел, так не получается, буду благодарен за пример или объяснение.


С методами, понятное дело, так не получается

#include <iostream>
#include <thread>

class C
{
public:
    void method(int a, float b)
    {
        std::cout << a << ' ' << b << std::endl;
    }
};

int
main(void)
{
    C c;
    std::thread t1(&C::method, c, 10, 3.14f);
    t1.join();
    return 0;
}
xaizek ★★★★★
()
#include <functional>
#include <thread>


struct A {
    void foo1(int b, double c) {
        std::thread t(&A::bar, this, c, b);
        t.detach();
    }

    void foo2(int b, double c) {
        std::thread t([this, b, c]() {
            bar(c, b);
        });
        t.detach();
    }

    void foo3(int b, double c) {
        std::thread t(std::bind(&A::bar, this, c, b));
        t.detach();
    }

    void bar(double f, int g) {}
};
anonymous
()
Ответ на: комментарий от anonymous

по ссылке this захватывают только мудаки

anonymous
()
Ответ на: комментарий от xaizek

Спасибо за пример, но Вашем случае я вызываю метод из main, а мне нужно вызвать из метода вызвать другой метод... Хотя может разницы особой и нет)

VladV
() автор топика
Ответ на: комментарий от VladV

метод А должен вызвать метод Б в параллельном потоке (thread t1) и открепить (t1.detach()) его, в свою очередь метод Б должен иметь возможность продолжать работать с объектом Х

Самое интересное вас ждет впереди. Могу посоветовать книгу «Параллельное программирование на С++ в действии. Практика разработки многопоточных программ», но её лучше читать в электронном формате - качество бумаги отвратительное.

Nietzsche
()
Ответ на: комментарий от VladV

Из метода аналогично, просто надо this использовать. Но смотрите, чтобы отсоединённый поток не жил дольше самого объекта.

class C
{
public:
    void method1()
    {
        std::thread t1(&C::method2, this, 10, 3.14f);
        t1.detach();
    }

    void method2(int a, float b) { }
};

xaizek ★★★★★
()
Ответ на: комментарий от Nietzsche

Спасибо, уже нашел в гугл, нужно будет прикупить))

VladV
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.