首页 > 解决方案 > C++用内部类的方法启动线程

问题描述

我有一个包含内部类 A 的类 B。类 A 有一个需要访问 B 的某些成员的方法,因此它具有对外部类的引用和另一个参数作为一个参数。现在我想在 B 的另一个线程中启动这个方法。

我知道这可能是这个问题的重复:Start thread with member function 但是我下面的最小示例没有编译。它说:

Error C2672 "std::invoke": No matching overloaded function found.

Error C2893 Failed to specialize function template "unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)".

这可能与通过引用传递有关,但使用std::ref对我没有帮助。

溴化氢

#include <thread>

class B
{
public:
    class A
    {
     public:
        int member_a;
    
        A(int member);
        void calc(B& b, int factor);
        std::thread thread_starting_wrapper(B& b, int factor);
    };

    int member_b;
    std::thread myTread;
    A* myA;

    B();
    std::thread start_thread();
    std::thread start_thread_wrapper();
};

B.cpp

#include "B.h"
#include <iostream>


B::B()
{
    member_b = 10;
    myTread = std::thread(nullptr);
    myA = new A(5);
}

B::A::A(int member)
{
    member_a = member;
}


void B::A::calc(B& b, int factor)
{
     std::cout << (b.member_b + member_a) * factor << std::endl;
}

std::thread B::start_thread()
{
    return std::thread(&B::A::calc, myA, std::ref(*this), 2);
    // return std::thread([this] { this->myA->calc(std::ref(*this), 2); } );
}

std::thread B::A::thread_starting_wrapper(B& b, int factor)
{
    return std::thread([&] {calc(std::ref(b), factor);});
}

std::thread B::start_thread_wrapper()
{
     return this->myA->thread_starting_wrapper(std::ref(*this), 2);
}

主文件

#include "B.h"

int main()
{
    B* b = new B();
    std::thread t = b->start_thread();
    //std::thread t2 = b->start_thread_wrapper();
    t.join();
}

使用 lambda 版本或将函数包装到 A 中都没有帮助。我错过了什么?

标签: c++multithreadingreference

解决方案


您正在尝试传递nullptrstd::thread构造函数B::B()

myTread = std::thread(nullptr);

重写它以使用成员初始化器列表并std::thread默认构造它可能如下所示:

B::B() : member_b{10}, myTread{}, myA{new A(5)} {}

推荐阅读