Многопоточность С++ 11 с функцией-членом класса

Я хочу использовать многопоточность в С++ 11 для вызова функции-члена класса в своем собственном потоке. Мне удалось заставить это работать с глобальной функцией:

#include <thread>
#include <iostream>

void Alpha(int x)
{
    while (true)
    {
        std::cout << x << std::endl;
    }
}

int main()
{
    std::thread alpha_thread(Alpha, 5);
    alpha_thread.join();

    return 0;
}

Однако я не могу заставить его скомпилировать функцию-член класса:

#include <thread>
#include <iostream>

class Beta
{
public:
    void Gamma(int y)
    {
        while (true)
        {
            std::cout << y << std::endl;
        }
    }
};

int main()
{
    Beta my_beta;
    std::thread gamma_thread(my_beta.Gamma, 5);
    gamma_thread.join();

    return 0;
}

Ошибка компиляции:

no matching function for call to 'std::thread::thread(<unresolved overloaded function type>)'
 std::thread gamma_thread(my_beta.Gamma, 5);
                                    ^

Что я делаю неправильно?


person Karnivaurus    schedule 20.04.2015    source источник


Ответы (3)


Вам нужно передать две вещи: указатель на член и объект. Вы не можете вызывать нестатическую функцию-член (например, Gamma) в C++ без объекта. Правильный синтаксис будет:

std::thread gamma_thread(&Beta::Gamma, // the pointer-to-member
                         my_beta,      // the object, could also be a pointer
                         5);           // the argument

Здесь вы можете думать о my_beta как о первом аргументе Gamma(), а 5 — как о втором.

person Barry    schedule 20.04.2015
comment
Если я хочу создать thread внутри текущего конструктора объектов, должен ли я изменить my_beta на this? - person Michel Feinstein; 27.09.2019
comment
@mFeinstein Если вы вызываете свою собственную функцию-член, да. - person Barry; 27.09.2019

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

std::thread gamma_thread(&Beta::Gamma, my_beta, 5);

Это немного утечка абстракции, конечно.

person Lightness Races in Orbit    schedule 20.04.2015
comment
Я посмеялся над явным неявным this - person Barry; 20.04.2015

У вас есть несколько проблем в вашей программе

  1. Как говорит ваша ошибка компиляции, вам нужно передать адрес функции &Beta::Gamma.
  2. Вам нужно передать объект в качестве параметра, учитывая, что this является неявным параметром функции-члена.

Измененный источник

#include <thread>
#include <iostream>

class Beta
{
public:
    void Gamma(int y)
    {
        while (true)
        {
            std::cout << y << std::endl;
        }
    }
};

int main()
{
    Beta my_beta;
    std::thread gamma_thread(&Beta::Gamma, my_beta, 5);
    gamma_thread.join();

    return 0;
}
person Abhijit    schedule 20.04.2015